DPsim
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
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
23
24namespace py = pybind11;
25using namespace pybind11::literals;
26
30 const py::handle &item) {
31 if (py::isinstance<CPS::TopologicalNode>(item))
32 sys.addNode(item.cast<CPS::TopologicalNode::Ptr>());
33 else if (py::isinstance<CPS::IdentifiedObject>(item))
35 else
36 throw py::type_error("SystemTopology.add expects a node, a component, "
37 "or a list of nodes and components");
38}
39
40PYBIND11_MODULE(dpsimpy, m) {
41 m.doc() = R"pbdoc(
42 DPsim Python bindings
43 -----------------------
44 The Python bindings provide access to most of the DPsim features implemented in C++.
45 It is possible to run powerflow, quasi-static, dynamic phasor and electromagnetic transient simulations
46 and to parameterize all components of the network from Python.
47 )pbdoc";
48
49 //Enums
50 py::enum_<CPS::Logger::Level>(m, "LogLevel")
51 .value("trace", CPS::Logger::Level::trace)
52 .value("debug", CPS::Logger::Level::debug)
53 .value("info", CPS::Logger::Level::info)
54 .value("warn", CPS::Logger::Level::warn)
55 .value("err", CPS::Logger::Level::err)
56 .value("critical", CPS::Logger::Level::critical)
57 .value("off", CPS::Logger::Level::off);
58
59 py::class_<CPS::Math>(m, "Math")
60 .def_static("single_phase_variable_to_three_phase",
62 .def_static("single_phase_parameter_to_three_phase",
64 .def_static("single_phase_power_to_three_phase",
66
67 py::enum_<DPsim::Solver::Behaviour>(m, "SolverBehaviour")
68 .value("Initialization", DPsim::Solver::Behaviour::Initialization)
69 .value("Simulation", DPsim::Solver::Behaviour::Simulation);
70
71 py::enum_<DPsim::Solver::SystemMatrixRecomputationMode>(
72 m, "SystemMatrixRecomputationMode")
75 .value("Disabled",
77
78 py::enum_<CPS::Domain>(m, "Domain")
79 .value("SP", CPS::Domain::SP)
80 .value("DP", CPS::Domain::DP)
81 .value("EMT", CPS::Domain::EMT);
82
83 py::enum_<CPS::PhaseType>(m, "PhaseType")
84 .value("A", CPS::PhaseType::A)
85 .value("B", CPS::PhaseType::B)
86 .value("C", CPS::PhaseType::C)
87 .value("ABC", CPS::PhaseType::ABC)
88 .value("Single", CPS::PhaseType::Single)
89 .value("DC", CPS::PhaseType::DC);
90
91 py::enum_<CPS::PowerflowBusType>(m, "PowerflowBusType")
92 .value("PV", CPS::PowerflowBusType::PV)
93 .value("PQ", CPS::PowerflowBusType::PQ)
94 .value("VD", CPS::PowerflowBusType::VD)
95 .value("None", CPS::PowerflowBusType::None);
96
97 py::enum_<CPS::GeneratorType>(m, "GeneratorType")
98 .value("PVNode", CPS::GeneratorType::PVNode)
99 .value("TransientStability", CPS::GeneratorType::TransientStability)
100 .value("IdealVoltageSource", CPS::GeneratorType::IdealVoltageSource)
101 .value("SG3OrderVBR", CPS::GeneratorType::SG3OrderVBR)
102 .value("SG4OrderVBR", CPS::GeneratorType::SG4OrderVBR)
103 .value("SG5OrderVBR", CPS::GeneratorType::SG5OrderVBR)
104 .value("SG6aOrderVBR", CPS::GeneratorType::SG6aOrderVBR)
105 .value("SG6bOrderVBR", CPS::GeneratorType::SG6bOrderVBR)
106 .value("FullOrderVBR", CPS::GeneratorType::FullOrderVBR)
107 .value("FullOrder", CPS::GeneratorType::FullOrder)
108 .value("NONE", CPS::GeneratorType::None);
109
110 py::enum_<CPS::CouplingMethod>(m, "CouplingMethod")
111 .value("DELAY", CPS::CouplingMethod::DELAY)
112 .value("EXTRAPOLATION_ZOH", CPS::CouplingMethod::EXTRAPOLATION_ZOH)
113 .value("EXTRAPOLATION_LINEAR", CPS::CouplingMethod::EXTRAPOLATION_LINEAR);
114
115 py::enum_<DPsim::Solver::Type>(m, "Solver")
116 .value("MNA", DPsim::Solver::Type::MNA)
117 .value("DAE", DPsim::Solver::Type::DAE)
118 .value("NRP", DPsim::Solver::Type::NRP);
119
120 py::enum_<DPsim::DirectLinearSolverImpl>(m, "DirectLinearSolverImpl")
127 .value("CUDAMagma", DPsim::DirectLinearSolverImpl::CUDAMagma);
128
129 py::enum_<DPsim::SCALING_METHOD>(m, "scaling_method")
130 .value("no_scaling", DPsim::SCALING_METHOD::NO_SCALING)
131 .value("sum_scaling", DPsim::SCALING_METHOD::SUM_SCALING)
132 .value("max_scaling", DPsim::SCALING_METHOD::MAX_SCALING);
133
134 py::enum_<DPsim::FILL_IN_REDUCTION_METHOD>(m, "fill_in_reduction_method")
139
140 py::enum_<DPsim::PARTIAL_REFACTORIZATION_METHOD>(
141 m, "partial_refactorization_method")
142 .value("no_partial_refactorization",
144 .value("factorization_path",
146 .value("refactorization_restart",
148
149 py::enum_<DPsim::USE_BTF>(m, "use_btf")
150 .value("no_btf", DPsim::USE_BTF::NO_BTF)
151 .value("do_btf", DPsim::USE_BTF::DO_BTF);
152
153 py::enum_<CPS::CSVReader::Mode>(m, "CSVReaderMode")
154 .value("AUTO", CPS::CSVReader::Mode::AUTO)
155 .value("MANUAL", CPS::CSVReader::Mode::MANUAL);
156
157 py::enum_<CPS::CSVReader::DataFormat>(m, "CSVReaderFormat")
158 .value("HHMMSS", CPS::CSVReader::DataFormat::HHMMSS)
159 .value("SECONDS", CPS::CSVReader::DataFormat::SECONDS)
160 .value("HOURS", CPS::CSVReader::DataFormat::HOURS)
161 .value("MINUTES", CPS::CSVReader::DataFormat::MINUTES);
162
163 py::enum_<DPsim::StateSpaceAnalysisFrame>(m, "StateSpaceAnalysisFrame")
166
167 m.attr("RMS3PH_TO_PEAK1PH") = RMS3PH_TO_PEAK1PH;
168 m.attr("PEAK1PH_TO_RMS3PH") = PEAK1PH_TO_RMS3PH;
169 m.attr("P_SNUB_TRANSFORMER") = P_SNUB_TRANSFORMER;
170 m.attr("Q_SNUB_TRANSFORMER") = Q_SNUB_TRANSFORMER;
171 m.attr("DOUBLE_EPSILON") = DOUBLE_EPSILON;
172
173 addAttributes(m);
174
175 py::class_<DPsim::DirectLinearSolverConfiguration>(
176 m, "DirectLinearSolverConfiguration")
177 .def(py::init<>())
178 .def("set_fill_in_reduction_method",
180 .def("set_scaling_method",
182 .def("set_partial_refactorization_method",
184 setPartialRefactorizationMethod)
186 .def("get_scaling_method",
188 .def("get_fill_in_reduction_method",
190 .def("get_partial_refactorization_method",
192 getPartialRefactorizationMethod)
194
195 py::class_<DPsim::MNAStateSpaceExtractor>(m, "MNAStateSpaceExtractor")
196 .def("is_initialized", &DPsim::MNAStateSpaceExtractor::isInitialized)
197 .def("get_state_count", &DPsim::MNAStateSpaceExtractor::getStateCount)
198 .def("get_time_step", &DPsim::MNAStateSpaceExtractor::getTimeStep)
199 .def("get_discrete_state_matrix",
201 py::return_value_policy::reference_internal);
202
203 py::class_<DPsim::StateSpaceModalAnalysis>(m, "StateSpaceModalAnalysis")
204 .def(py::init<const DPsim::MNAStateSpaceExtractor &>(),
205 py::keep_alive<1, 2>())
206 .def("set_analysis_frame",
208 .def("set_global_dq0_frame",
210 "theta0"_a = 0.0)
212 .def("get_discrete_eigenvalues",
214 py::return_value_policy::reference_internal)
215 .def("get_continuous_eigenvalues",
217 py::return_value_policy::reference_internal)
218 .def("get_right_eigenvectors",
220 py::return_value_policy::reference_internal)
221 .def("get_left_eigenvectors",
223 py::return_value_policy::reference_internal)
224 .def("get_participation_factors",
226 py::return_value_policy::reference_internal)
227 .def("get_state_names", &DPsim::StateSpaceModalAnalysis::getStateNames,
228 py::return_value_policy::reference_internal);
229
230 py::class_<DPsim::Simulation>(m, "Simulation")
231 .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
232 "loglevel"_a = CPS::Logger::Level::off)
233 .def("name", &DPsim::Simulation::name)
234 .def("set_time_step", &DPsim::Simulation::setTimeStep)
235 .def("set_final_time", &DPsim::Simulation::setFinalTime)
236 .def("add_logger", &DPsim::Simulation::addLogger)
237 .def("set_system", &DPsim::Simulation::setSystem)
238 .def("run", &DPsim::Simulation::run)
239 .def("set_solver", &DPsim::Simulation::setSolverType)
240 .def("set_pf_keep_last_solution",
242 .def("get_pf_keep_last_solution",
244 .def("set_pf_base_apparent_power_fallback",
246 .def("get_pf_base_apparent_power_fallback",
248 .def("set_pf_max_iterations", &DPsim::Simulation::setPFMaxIterations)
249 .def("get_pf_max_iterations", &DPsim::Simulation::getPFMaxIterations)
250 .def("set_pf_solver_use_sparse", &DPsim::Simulation::setPFSolverUseSparse)
251 .def("get_pf_solver_use_sparse", &DPsim::Simulation::getPFSolverUseSparse)
252 .def("set_pf_solver_enforce_q_limits",
254 .def("get_pf_solver_enforce_q_limits",
256 .def("set_pf_solver_base_voltage_loose_tolerance",
258 .def("get_pf_solver_base_voltage_loose_tolerance",
260 .def("set_pf_solver_base_voltage_strict_tolerance",
262 .def("get_pf_solver_base_voltage_strict_tolerance",
264 .def("set_domain", &DPsim::Simulation::setDomain)
265 .def("start", &DPsim::Simulation::start)
266 .def("next", &DPsim::Simulation::next)
267 .def("stop", &DPsim::Simulation::stop)
268 .def("get_idobj_attr", &DPsim::Simulation::getIdObjAttribute, "comp"_a,
269 "attr"_a)
270 .def("add_interface", &DPsim::Simulation::addInterface, "interface"_a)
271 .def("log_idobj_attribute", &DPsim::Simulation::logIdObjAttribute,
272 "comp"_a, "attr"_a)
273 .def("log_attribute", &DPsim::Simulation::logAttribute, "name"_a,
274 "attr"_a)
275 .def("do_init_from_nodes_and_terminals",
277 .def("set_system_matrix_recomputation_mode",
279 .def("do_system_matrix_recomputation",
281 .def("do_state_space_extraction",
283 py::arg_v("value", true, "True"))
284 .def("get_state_space_extractor",
285 &DPsim::Simulation::getStateSpaceExtractor, "solver_index"_a = 0,
286 py::return_value_policy::reference_internal)
287 .def("do_steady_state_init", &DPsim::Simulation::doSteadyStateInit)
288 .def("do_frequency_parallelization",
290 .def("do_split_subnets", &DPsim::Simulation::doSplitSubnets)
291 .def("set_tearing_components", &DPsim::Simulation::setTearingComponents)
292 .def("add_event", &DPsim::Simulation::addEvent)
293 .def("set_solver_component_behaviour",
295 .def("set_direct_solver_implementation",
297 .def("set_direct_linear_solver_configuration",
299 .def("log_lu_times", &DPsim::Simulation::logLUTimes);
300
301#ifdef WITH_RT
302 py::class_<DPsim::RealTimeSimulation, DPsim::Simulation>(m,
303 "RealTimeSimulation")
304 .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
305 "loglevel"_a = CPS::Logger::Level::info)
307 .def("set_time_step", &DPsim::RealTimeSimulation::setTimeStep)
308 .def("set_final_time", &DPsim::RealTimeSimulation::setFinalTime)
309 .def("add_logger", &DPsim::RealTimeSimulation::addLogger)
310 .def("set_system", &DPsim::RealTimeSimulation::setSystem)
311 .def("run",
312 static_cast<void (DPsim::RealTimeSimulation::*)(CPS::Int startIn)>(
315 .def("set_domain", &DPsim::RealTimeSimulation::setDomain);
316#endif
317
318 py::class_<CPS::SystemTopology, std::shared_ptr<CPS::SystemTopology>>(
319 m, "SystemTopology")
324 .def(py::init<CPS::Real>())
325 .def("add_component", &DPsim::SystemTopology::addComponent)
326 .def("add_component", &DPsim::SystemTopology::addComponents)
327 .def("add_node", &DPsim::SystemTopology::addNode)
328 // Deprecated alias for add_component/add_node, kept so that scripts
329 // written before the rename keep working
330 .def(
331 "add",
332 [](DPsim::SystemTopology &sys, const py::object &obj) {
333 if (PyErr_WarnEx(PyExc_DeprecationWarning,
334 "SystemTopology.add is deprecated; use "
335 "add_component for components and add_node "
336 "for nodes instead.",
337 1) == -1)
338 throw py::error_already_set();
339
340 if (py::isinstance<py::list>(obj) ||
341 py::isinstance<py::tuple>(obj)) {
342 for (const py::handle &item : obj)
343 systemTopologyAddSingle(sys, item);
344 } else {
345 systemTopologyAddSingle(sys, obj);
346 }
347 },
348 "Deprecated alias for add_component and add_node.")
349 .def("node", py::overload_cast<std::string_view>(
351 .def("node", py::overload_cast<CPS::UInt>(
353 .def("connect_component",
354 py::overload_cast<CPS::SimPowerComp<CPS::Real>::Ptr,
357 .def("connect_component",
358 py::overload_cast<CPS::SimPowerComp<CPS::Complex>::Ptr,
361 .def("component",
363 .def("add_tear_component", &DPsim::SystemTopology::addTearComponent)
364#ifdef WITH_GRAPHVIZ
365 .def("_repr_svg_", &DPsim::SystemTopology::render)
366 .def("render_to_file", &DPsim::SystemTopology::renderToFile)
367#endif
368 .def_readwrite("nodes", &DPsim::SystemTopology::mNodes)
369 .def_readwrite("components", &DPsim::SystemTopology::mComponents)
370 .def_readwrite("components_at_node",
372 .def_readonly("tear_components", &DPsim::SystemTopology::mTearComponents)
373 .def("list_idobjects", &DPsim::SystemTopology::listIdObjects)
374 .def("init_with_powerflow", &DPsim::SystemTopology::initWithPowerflow,
375 "systemPF"_a, "domain"_a)
376 .def("add_components", &DPsim::SystemTopology::addComponents)
377 .def("remove_component", &DPsim::SystemTopology::removeComponent)
378 .def("remove_node", &DPsim::SystemTopology::removeNode);
379
380 py::class_<DPsim::Interface, std::shared_ptr<DPsim::Interface>>(m,
381 "Interface");
382
384 std::shared_ptr<DPsim::DataLoggerInterface>>(m,
385 "DataLoggerInterface")
386 .def("log_attribute",
387 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
390 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
392 .def("log_attribute",
393 py::overload_cast<const std::vector<CPS::String> &,
396 "names"_a, "attr"_a)
398 .def("log_attribute",
400 const std::vector<CPS::String> &names, const CPS::String &attr,
401 const CPS::IdentifiedObject &comp) {
402 logger.logAttribute(names, comp.attribute(attr));
403 });
404
406 std::shared_ptr<DPsim::DataLogger>>(m, "Logger")
407 .def(py::init<std::string>())
408 .def_static("set_log_dir", &CPS::Logger::setLogDir)
409 .def_static("get_log_dir", &CPS::Logger::logDir)
410 .def("log_attribute",
411 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
414 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
416 .def("log_attribute",
417 py::overload_cast<const std::vector<CPS::String> &,
420 "names"_a, "attr"_a)
422 .def(
423 "log_attribute",
424 [](DPsim::DataLogger &logger, const CPS::String &name,
425 const CPS::String &attr, const CPS::IdentifiedObject &comp,
426 CPS::UInt rowsMax, CPS::UInt colsMax) {
427 logger.logAttribute(name, comp.attribute(attr), rowsMax, colsMax);
428 },
429 "name"_a, "attr"_a, "comp"_a, "rows_max"_a = 0, "cols_max"_a = 0)
431 .def("log_attribute",
432 [](DPsim::DataLogger &logger, const std::vector<CPS::String> &names,
433 const CPS::String &attr, const CPS::IdentifiedObject &comp) {
434 logger.logAttribute(names, comp.attribute(attr));
435 });
436#ifdef WITH_RT
438 std::shared_ptr<DPsim::RealTimeDataLogger>>(m,
439 "RealTimeDataLogger")
440
441 .def(py::init([](py::object filename, DPsim::Real final_time,
442 DPsim::Real time_step) {
443 py::object fspath =
444 py::module_::import("os").attr("fspath")(filename);
445 std::string s = py::cast<std::string>(fspath);
446 std::filesystem::path p(s);
447 return std::make_shared<DPsim::RealTimeDataLogger>(p, final_time,
448 time_step);
449 }),
450 "filename"_a, "final_time"_a, "time_step"_a)
451
452 .def(py::init([](py::object filename, std::size_t row_number) {
453 py::object fspath =
454 py::module_::import("os").attr("fspath")(filename);
455 std::string s = py::cast<std::string>(fspath);
456 std::filesystem::path p(s);
457 return std::make_shared<DPsim::RealTimeDataLogger>(p, row_number);
458 }),
459 "filename"_a, "row_number"_a)
460
461 .def("log_attribute",
462 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
465 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
466
467 .def("log_attribute",
468 py::overload_cast<const std::vector<CPS::String> &,
471 "names"_a, "attr"_a)
472
473 .def(
474 "log_attribute",
475 [](DPsim::RealTimeDataLogger &logger, const CPS::String &name,
476 const CPS::String &attr, const CPS::IdentifiedObject &comp,
477 CPS::UInt rowsMax, CPS::UInt colsMax) {
478 logger.logAttribute(name, comp.attribute(attr), rowsMax, colsMax);
479 },
480 "name"_a, "attr"_a, "comp"_a, "rows_max"_a = 0, "cols_max"_a = 0)
481
482 .def(
483 "log_attribute",
484 [](DPsim::RealTimeDataLogger &logger,
485 const std::vector<CPS::String> &names, const CPS::String &attr,
486 const CPS::IdentifiedObject &comp) {
487 logger.logAttribute(names, comp.attribute(attr));
488 },
489 "names"_a, "attr"_a, "comp"_a);
490#endif
491
492 py::class_<CPS::IdentifiedObject, std::shared_ptr<CPS::IdentifiedObject>>(
493 m, "IdentifiedObject")
494 .def("name", &CPS::IdentifiedObject::name)
498 .def("attr", &CPS::IdentifiedObject::attribute, "name"_a)
499 .def("print_attribute_list", &printAttributes)
500 .def("print_attribute", &printAttribute, "attribute_name"_a)
501 .def("__str__", &getAttributeList);
502
503#ifdef WITH_CIM
504 py::enum_<CPS::CIM::Reader::VoltageTargetUnit>(m,
505 "CIMReaderVoltageTargetUnit")
509
510 py::class_<CPS::CIM::Reader>(m, "CIMReader")
511 .def(py::init<std::string, CPS::Logger::Level, CPS::Logger::Level>(),
512 "name"_a, "loglevel"_a = CPS::Logger::Level::info,
513 "comploglevel"_a = CPS::Logger::Level::off)
514 .def("loadCIM", (CPS::SystemTopology(CPS::CIM::Reader::*)(
515 CPS::Real, const std::list<CPS::String> &,
518 .def("set_extnet_voltage_target_unit",
520#endif
521
522 py::class_<CPS::CSVReader>(m, "CSVReader")
523 .def(py::init<std::string, const std::string &,
524 std::map<std::string, std::string> &, CPS::Logger::Level>())
525 .def("assignLoadProfile", &CPS::CSVReader::assignLoadProfile);
526
527 //Base Classes
528
529 py::class_<CPS::TopologicalPowerComp,
530 std::shared_ptr<CPS::TopologicalPowerComp>, CPS::IdentifiedObject>(
531 m, "TopologicalPowerComp");
532 py::class_<CPS::SimPowerComp<CPS::Complex>,
533 std::shared_ptr<CPS::SimPowerComp<CPS::Complex>>,
534 CPS::TopologicalPowerComp>(m, "SimPowerCompComplex")
536 .def("set_intf_current", &CPS::SimPowerComp<CPS::Complex>::setIntfCurrent)
537 .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Complex>::setIntfVoltage)
538 .def("get_terminal", &CPS::SimPowerComp<CPS::Complex>::terminal,
539 "index"_a);
540 py::class_<CPS::SimPowerComp<CPS::Real>,
541 std::shared_ptr<CPS::SimPowerComp<CPS::Real>>,
542 CPS::TopologicalPowerComp>(m, "SimPowerCompReal")
544 .def("set_intf_current", &CPS::SimPowerComp<CPS::Real>::setIntfCurrent)
545 .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Real>::setIntfVoltage)
546 .def("get_terminal", &CPS::SimPowerComp<CPS::Real>::terminal, "index"_a);
547 py::class_<CPS::TopologicalNode, std::shared_ptr<CPS::TopologicalNode>,
548 CPS::IdentifiedObject>(m, "TopologicalNode")
549 .def("initial_single_voltage",
551 "phase_type"_a = CPS::PhaseType::Single);
552
553 py::class_<CPS::TopologicalTerminal,
554 std::shared_ptr<CPS::TopologicalTerminal>, CPS::IdentifiedObject>(
555 m, "TopologicalTerminal")
556 .def("set_power",
557 py::overload_cast<CPS::Complex>(&CPS::TopologicalTerminal::setPower))
558 .def("set_power", py::overload_cast<CPS::MatrixComp>(
560
561 py::class_<CPS::SimTerminal<CPS::Complex>,
562 std::shared_ptr<CPS::SimTerminal<CPS::Complex>>,
563 CPS::TopologicalTerminal>(m, "SimTerminalComplex");
564 py::class_<CPS::SimTerminal<CPS::Real>,
565 std::shared_ptr<CPS::SimTerminal<CPS::Real>>,
566 CPS::TopologicalTerminal>(m, "SimTerminalReal");
567
568 //Events
569 py::module mEvent = m.def_submodule("event", "events");
570 py::class_<DPsim::Event, std::shared_ptr<DPsim::Event>>(mEvent, "Event");
571 py::class_<DPsim::SwitchEvent, std::shared_ptr<DPsim::SwitchEvent>,
572 DPsim::Event>(mEvent, "SwitchEvent", py::multiple_inheritance())
573 .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph1::Switch>,
574 CPS::Bool>());
575 py::class_<DPsim::SwitchEvent3Ph, std::shared_ptr<DPsim::SwitchEvent3Ph>,
576 DPsim::Event>(mEvent, "SwitchEvent3Ph", py::multiple_inheritance())
577 .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph3::Switch>,
578 CPS::Bool>());
579
580 //Components
581 py::module mBase = m.def_submodule("base", "base models");
582 addBaseComponents(mBase);
583
584 py::module mDP = m.def_submodule("dp", "dynamic phasor models");
585 addDPComponents(mDP);
586
587 py::module mEMT = m.def_submodule("emt", "electromagnetic-transient models");
588 addEMTComponents(mEMT);
589
590 py::module mSP = m.def_submodule("sp", "static phasor models");
591 mSP.attr("SimNode") = mDP.attr("SimNode");
592 addSPComponents(mSP);
593
594 py::module mSignal = m.def_submodule("signal", "signal models");
595 addSignalComponents(mSignal);
596
597#ifdef VERSION_INFO
598 m.attr("__version__") = VERSION_INFO;
599#else
600 m.attr("__version__") = "dev";
601#endif
602}
void addAttributes(py::module_ m)
void addBaseComponents(py::module_ mBase)
void addDPComponents(py::module_ mDP)
void addEMTComponents(py::module_ mEMT)
void addSPComponents(py::module_ mSP)
void addSignalComponents(py::module_ mSignal)
AttributePointer< AttributeBase > Ptr
Definition Attribute.h:122
void setExtnetVoltageTargetUnit(VoltageTargetUnit unit)
Definition Reader.cpp:62
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:249
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
std::shared_ptr< IdentifiedObject > Ptr
std::vector< Ptr > List
AttributeBase::Ptr attribute(const String &name) const
Return pointer to an attribute.
spdlog::level::level_enum Level
Definition Logger.h:33
static void setLogDir(String path)
Set env variable CPS_LOG_DIR and overwrite.
Definition Logger.cpp:88
static String logDir()
Definition Logger.cpp:81
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.
std::vector< Ptr > List
Definition SimNode.h:33
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.
void setIntfVoltage(MatrixVar< VarType > voltage)
void setIntfCurrent(MatrixVar< VarType > current)
std::shared_ptr< SimPowerComp< VarType > > Ptr
void removeNode(const String &name)
Remove node and all components connected to it.
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.
std::map< String, String, std::less<> > listIdObjects() const
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.
std::vector< Ptr > List
std::shared_ptr< TopologicalNode > Ptr
Complex initialSingleVoltage(PhaseType phaseType=PhaseType::Single)
virtual void logAttribute(const String &name, CPS::AttributeBase::Ptr attr, UInt rowsMax=0, UInt colsMax=0)
void setFillInReductionMethod(FILL_IN_REDUCTION_METHOD fillInReductionMethod)
FILL_IN_REDUCTION_METHOD getFillInReductionMethod() const
const Matrix & getDiscreteStateMatrix() const
Extending Simulation class by real-time functionality.
void run(const Timer::StartClock::duration &startIn=std::chrono::seconds(1))
void setDirectLinearSolverImplementation(DirectLinearSolverImpl directImpl)
Definition Simulation.h:208
void doFrequencyParallelization(Bool value)
Compute phasors of different frequencies in parallel.
Definition Simulation.h:238
void logIdObjAttribute(const String &comp, const String &attr)
CPS::UInt getPFMaxIterations() const
void logLUTimes()
Write LU decomposition times measurements to log file.
void setSolverType(Solver::Type solverType=Solver::Type::MNA)
Definition Simulation.h:200
void setSystem(const CPS::SystemTopology &system)
Definition Simulation.h:192
String name() const
Definition Simulation.h:339
void setFinalTime(Real finalTime)
Definition Simulation.h:196
void setPFSolverBaseVoltageLooseTolerance(Real tolerance)
void setSystemMatrixRecomputationMode(Solver::SystemMatrixRecomputationMode mode)
Set the system-matrix recomputation mode.
Definition Simulation.h:241
void setTimeStep(Real timeStep)
Definition Simulation.h:194
void setTearingComponents(CPS::IdentifiedObject::List tearComponents=CPS::IdentifiedObject::List())
Definition Simulation.h:229
void setPFKeepLastSolution(Bool value)
Real next()
Run until next time step.
void setDirectLinearSolverConfiguration(const DirectLinearSolverConfiguration &configuration)
Definition Simulation.h:212
Bool getPFSolverEnforceReactiveLimits() const
void addLogger(DataLoggerInterface::Ptr logger)
Add a new data logger.
Definition Simulation.h:316
void doInitFromNodesAndTerminals(Bool f=true)
Definition Simulation.h:221
void setPFMaxIterations(CPS::UInt value)
void setPFBaseApparentPowerFallback(Real value)
Bool getPFSolverUseSparse() const
void doSplitSubnets(Bool splitSubnets=true)
Definition Simulation.h:225
void setSolverAndComponentBehaviour(Solver::Behaviour behaviour)
set solver and component to initialization or simulation behaviour
Definition Simulation.h:204
void setDomain(CPS::Domain domain=CPS::Domain::DP)
Definition Simulation.h:198
Real getPFBaseApparentPowerFallback() const
Bool getPFKeepLastSolution() const
void setPFSolverUseSparse(Bool value)
void setPFSolverEnforceReactiveLimits(Bool value)
Real getPFSolverBaseVoltageLooseTolerance() const
CPS::AttributeBase::Ptr getIdObjAttribute(const String &comp, const String &attr)
CHECK: Can these be deleted? getIdObjAttribute + "**attr =" should suffice.
void addInterface(Interface::Ptr eint)
Definition Simulation.h:328
void start()
Start simulation without advancing in time.
void doSteadyStateInit(Bool f)
activate steady state initialization
Definition Simulation.h:261
void addEvent(Event::Ptr e)
Schedule an event in the simulation.
Definition Simulation.h:314
void doStateSpaceExtraction(Bool value=true)
Enable extraction of the MNA-coupled discrete-time state matrix.
Definition Simulation.h:252
void run()
Run simulation until total time is elapsed.
void setPFSolverBaseVoltageStrictTolerance(Real tolerance)
void logAttribute(String name, CPS::AttributeBase::Ptr attr)
CHECK: Can we store the attribute name / UID intrinsically inside the attribute?
const MNAStateSpaceExtractor & getStateSpaceExtractor(UInt solverIndex=0) const
Real getPFSolverBaseVoltageStrictTolerance() const
void stop()
Stop simulation including scheduler and interfaces.
void doSystemMatrixRecomputation(Bool value)
Definition Simulation.h:246
@ Initialization
Definition Solver.h:35
@ Enabled
Always enable system-matrix recomputation.
Definition Solver.h:42
@ Auto
Select the mode automatically based on the system topology.
Definition Solver.h:40
@ Disabled
Always disable system-matrix recomputation.
Definition Solver.h:44
void setAnalysisFrame(StateSpaceAnalysisFrame frame)
const std::vector< String > & getStateNames() const
const CPS::VectorComp & getContinuousEigenvalues() const
Continuous-time equivalent eigenvalues reconstructed from discrete eigenvalues.
const CPS::VectorComp & getDiscreteEigenvalues() const
Eigenvalues of the extracted discrete-time state matrix in the selected analysis frame.
void update()
Update modal quantities from the current extracted state matrix.
void setGlobalDq0Frame(Real omega, Real theta0=0.0)
const CPS::MatrixComp & getLeftEigenvectors() const
const CPS::MatrixComp & getRightEigenvectors() const
const CPS::MatrixComp & getParticipationFactors() const
#define Q_SNUB_TRANSFORMER
Definition Definitions.h:54
#define RMS3PH_TO_PEAK1PH
Definition Definitions.h:50
#define P_SNUB_TRANSFORMER
Definition Definitions.h:53
#define PEAK1PH_TO_RMS3PH
Definition Definitions.h:51
#define DOUBLE_EPSILON
Definition Definitions.h:14
PYBIND11_DECLARE_HOLDER_TYPE(T, CPS::AttributePointer< T >)
static void systemTopologyAddSingle(DPsim::SystemTopology &sys, const py::handle &item)
Definition main.cpp:29
PYBIND11_MODULE(dpsimpy, m)
Definition main.cpp:40
Eigen::Matrix< Real, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > Matrix
Dense matrix for real numbers.
Definition Definitions.h:81
std::string String
Definition Definitions.h:65
double Real
Definition Definitions.h:62
int Int
Definition Definitions.h:61
bool Bool
Definition Definitions.h:64
GeneratorType
unsigned int UInt
Definition Definitions.h:60
CPS::Real Real
Definition Definitions.h:18
CPS::SystemTopology SystemTopology
Definition DPsim.h:34
void printAttribute(CPS::IdentifiedObject &obj, std::string attrName)
Definition Utils.cpp:74
std::string getAttributeList(CPS::IdentifiedObject &obj)
Definition Utils.cpp:13
void printAttributes(CPS::IdentifiedObject &obj)
Definition Utils.cpp:70