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
90 py::enum_<CPS::PowerflowBusType>(m, "PowerflowBusType")
91 .value("PV", CPS::PowerflowBusType::PV)
92 .value("PQ", CPS::PowerflowBusType::PQ)
93 .value("VD", CPS::PowerflowBusType::VD)
94 .value("None", CPS::PowerflowBusType::None);
95
96 py::enum_<CPS::GeneratorType>(m, "GeneratorType")
97 .value("PVNode", CPS::GeneratorType::PVNode)
98 .value("TransientStability", CPS::GeneratorType::TransientStability)
99 .value("IdealVoltageSource", CPS::GeneratorType::IdealVoltageSource)
100 .value("SG3OrderVBR", CPS::GeneratorType::SG3OrderVBR)
101 .value("SG4OrderVBR", CPS::GeneratorType::SG4OrderVBR)
102 .value("SG5OrderVBR", CPS::GeneratorType::SG5OrderVBR)
103 .value("SG6aOrderVBR", CPS::GeneratorType::SG6aOrderVBR)
104 .value("SG6bOrderVBR", CPS::GeneratorType::SG6bOrderVBR)
105 .value("FullOrderVBR", CPS::GeneratorType::FullOrderVBR)
106 .value("FullOrder", CPS::GeneratorType::FullOrder)
107 .value("NONE", CPS::GeneratorType::None);
108
109 py::enum_<CPS::CouplingMethod>(m, "CouplingMethod")
110 .value("DELAY", CPS::CouplingMethod::DELAY)
111 .value("EXTRAPOLATION_ZOH", CPS::CouplingMethod::EXTRAPOLATION_ZOH)
112 .value("EXTRAPOLATION_LINEAR", CPS::CouplingMethod::EXTRAPOLATION_LINEAR);
113
114 py::enum_<DPsim::Solver::Type>(m, "Solver")
115 .value("MNA", DPsim::Solver::Type::MNA)
116 .value("DAE", DPsim::Solver::Type::DAE)
117 .value("NRP", DPsim::Solver::Type::NRP);
118
119 py::enum_<DPsim::DirectLinearSolverImpl>(m, "DirectLinearSolverImpl")
126 .value("CUDAMagma", DPsim::DirectLinearSolverImpl::CUDAMagma);
127
128 py::enum_<DPsim::SCALING_METHOD>(m, "scaling_method")
129 .value("no_scaling", DPsim::SCALING_METHOD::NO_SCALING)
130 .value("sum_scaling", DPsim::SCALING_METHOD::SUM_SCALING)
131 .value("max_scaling", DPsim::SCALING_METHOD::MAX_SCALING);
132
133 py::enum_<DPsim::FILL_IN_REDUCTION_METHOD>(m, "fill_in_reduction_method")
138
139 py::enum_<DPsim::PARTIAL_REFACTORIZATION_METHOD>(
140 m, "partial_refactorization_method")
141 .value("no_partial_refactorization",
143 .value("factorization_path",
145 .value("refactorization_restart",
147
148 py::enum_<DPsim::USE_BTF>(m, "use_btf")
149 .value("no_btf", DPsim::USE_BTF::NO_BTF)
150 .value("do_btf", DPsim::USE_BTF::DO_BTF);
151
152 py::enum_<CPS::CSVReader::Mode>(m, "CSVReaderMode")
153 .value("AUTO", CPS::CSVReader::Mode::AUTO)
154 .value("MANUAL", CPS::CSVReader::Mode::MANUAL);
155
156 py::enum_<CPS::CSVReader::DataFormat>(m, "CSVReaderFormat")
157 .value("HHMMSS", CPS::CSVReader::DataFormat::HHMMSS)
158 .value("SECONDS", CPS::CSVReader::DataFormat::SECONDS)
159 .value("HOURS", CPS::CSVReader::DataFormat::HOURS)
160 .value("MINUTES", CPS::CSVReader::DataFormat::MINUTES);
161
162 py::enum_<DPsim::StateSpaceAnalysisFrame>(m, "StateSpaceAnalysisFrame")
165
166 m.attr("RMS3PH_TO_PEAK1PH") = RMS3PH_TO_PEAK1PH;
167 m.attr("PEAK1PH_TO_RMS3PH") = PEAK1PH_TO_RMS3PH;
168 m.attr("P_SNUB_TRANSFORMER") = P_SNUB_TRANSFORMER;
169 m.attr("Q_SNUB_TRANSFORMER") = Q_SNUB_TRANSFORMER;
170 m.attr("DOUBLE_EPSILON") = DOUBLE_EPSILON;
171
172 addAttributes(m);
173
174 py::class_<DPsim::DirectLinearSolverConfiguration>(
175 m, "DirectLinearSolverConfiguration")
176 .def(py::init<>())
177 .def("set_fill_in_reduction_method",
179 .def("set_scaling_method",
181 .def("set_partial_refactorization_method",
183 setPartialRefactorizationMethod)
185 .def("get_scaling_method",
187 .def("get_fill_in_reduction_method",
189 .def("get_partial_refactorization_method",
191 getPartialRefactorizationMethod)
193
194 py::class_<DPsim::MNAStateSpaceExtractor>(m, "MNAStateSpaceExtractor")
195 .def("is_initialized", &DPsim::MNAStateSpaceExtractor::isInitialized)
196 .def("get_state_count", &DPsim::MNAStateSpaceExtractor::getStateCount)
197 .def("get_time_step", &DPsim::MNAStateSpaceExtractor::getTimeStep)
198 .def("get_discrete_state_matrix",
200 py::return_value_policy::reference_internal);
201
202 py::class_<DPsim::StateSpaceModalAnalysis>(m, "StateSpaceModalAnalysis")
203 .def(py::init<const DPsim::MNAStateSpaceExtractor &>(),
204 py::keep_alive<1, 2>())
205 .def("set_analysis_frame",
207 .def("set_global_dq0_frame",
209 "theta0"_a = 0.0)
211 .def("get_discrete_eigenvalues",
213 py::return_value_policy::reference_internal)
214 .def("get_continuous_eigenvalues",
216 py::return_value_policy::reference_internal)
217 .def("get_right_eigenvectors",
219 py::return_value_policy::reference_internal)
220 .def("get_left_eigenvectors",
222 py::return_value_policy::reference_internal)
223 .def("get_participation_factors",
225 py::return_value_policy::reference_internal)
226 .def("get_state_names", &DPsim::StateSpaceModalAnalysis::getStateNames,
227 py::return_value_policy::reference_internal);
228
229 py::class_<DPsim::Simulation>(m, "Simulation")
230 .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
231 "loglevel"_a = CPS::Logger::Level::off)
232 .def("name", &DPsim::Simulation::name)
233 .def("set_time_step", &DPsim::Simulation::setTimeStep)
234 .def("set_final_time", &DPsim::Simulation::setFinalTime)
235 .def("add_logger", &DPsim::Simulation::addLogger)
236 .def("set_system", &DPsim::Simulation::setSystem)
237 .def("run", &DPsim::Simulation::run)
238 .def("set_solver", &DPsim::Simulation::setSolverType)
239 .def("set_pf_keep_last_solution",
241 .def("get_pf_keep_last_solution",
243 .def("set_pf_base_apparent_power_fallback",
245 .def("get_pf_base_apparent_power_fallback",
247 .def("set_pf_max_iterations", &DPsim::Simulation::setPFMaxIterations)
248 .def("get_pf_max_iterations", &DPsim::Simulation::getPFMaxIterations)
249 .def("set_pf_solver_use_sparse", &DPsim::Simulation::setPFSolverUseSparse)
250 .def("get_pf_solver_use_sparse", &DPsim::Simulation::getPFSolverUseSparse)
251 .def("set_pf_solver_enforce_q_limits",
253 .def("get_pf_solver_enforce_q_limits",
255 .def("set_pf_solver_base_voltage_loose_tolerance",
257 .def("get_pf_solver_base_voltage_loose_tolerance",
259 .def("set_pf_solver_base_voltage_strict_tolerance",
261 .def("get_pf_solver_base_voltage_strict_tolerance",
263 .def("set_domain", &DPsim::Simulation::setDomain)
264 .def("start", &DPsim::Simulation::start)
265 .def("next", &DPsim::Simulation::next)
266 .def("stop", &DPsim::Simulation::stop)
267 .def("get_idobj_attr", &DPsim::Simulation::getIdObjAttribute, "comp"_a,
268 "attr"_a)
269 .def("add_interface", &DPsim::Simulation::addInterface, "interface"_a)
270 .def("log_idobj_attribute", &DPsim::Simulation::logIdObjAttribute,
271 "comp"_a, "attr"_a)
272 .def("log_attribute", &DPsim::Simulation::logAttribute, "name"_a,
273 "attr"_a)
274 .def("do_init_from_nodes_and_terminals",
276 .def("set_system_matrix_recomputation_mode",
278 .def("do_system_matrix_recomputation",
280 .def("do_state_space_extraction",
282 py::arg_v("value", true, "True"))
283 .def("get_state_space_extractor",
284 &DPsim::Simulation::getStateSpaceExtractor, "solver_index"_a = 0,
285 py::return_value_policy::reference_internal)
286 .def("do_steady_state_init", &DPsim::Simulation::doSteadyStateInit)
287 .def("do_frequency_parallelization",
289 .def("do_split_subnets", &DPsim::Simulation::doSplitSubnets)
290 .def("set_tearing_components", &DPsim::Simulation::setTearingComponents)
291 .def("add_event", &DPsim::Simulation::addEvent)
292 .def("set_solver_component_behaviour",
294 .def("set_direct_solver_implementation",
296 .def("set_direct_linear_solver_configuration",
298 .def("log_lu_times", &DPsim::Simulation::logLUTimes);
299
300#ifdef WITH_RT
301 py::class_<DPsim::RealTimeSimulation, DPsim::Simulation>(m,
302 "RealTimeSimulation")
303 .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
304 "loglevel"_a = CPS::Logger::Level::info)
306 .def("set_time_step", &DPsim::RealTimeSimulation::setTimeStep)
307 .def("set_final_time", &DPsim::RealTimeSimulation::setFinalTime)
308 .def("add_logger", &DPsim::RealTimeSimulation::addLogger)
309 .def("set_system", &DPsim::RealTimeSimulation::setSystem)
310 .def("run",
311 static_cast<void (DPsim::RealTimeSimulation::*)(CPS::Int startIn)>(
314 .def("set_domain", &DPsim::RealTimeSimulation::setDomain);
315#endif
316
317 py::class_<CPS::SystemTopology, std::shared_ptr<CPS::SystemTopology>>(
318 m, "SystemTopology")
323 .def(py::init<CPS::Real>())
324 .def("add_component", &DPsim::SystemTopology::addComponent)
325 .def("add_component", &DPsim::SystemTopology::addComponents)
326 .def("add_node", &DPsim::SystemTopology::addNode)
327 // Deprecated alias for add_component/add_node, kept so that scripts
328 // written before the rename keep working
329 .def(
330 "add",
331 [](DPsim::SystemTopology &sys, const py::object &obj) {
332 if (PyErr_WarnEx(PyExc_DeprecationWarning,
333 "SystemTopology.add is deprecated; use "
334 "add_component for components and add_node "
335 "for nodes instead.",
336 1) == -1)
337 throw py::error_already_set();
338
339 if (py::isinstance<py::list>(obj) ||
340 py::isinstance<py::tuple>(obj)) {
341 for (const py::handle &item : obj)
342 systemTopologyAddSingle(sys, item);
343 } else {
344 systemTopologyAddSingle(sys, obj);
345 }
346 },
347 "Deprecated alias for add_component and add_node.")
348 .def("node", py::overload_cast<std::string_view>(
350 .def("node", py::overload_cast<CPS::UInt>(
352 .def("connect_component",
353 py::overload_cast<CPS::SimPowerComp<CPS::Real>::Ptr,
356 .def("connect_component",
357 py::overload_cast<CPS::SimPowerComp<CPS::Complex>::Ptr,
360 .def("component",
362 .def("add_tear_component", &DPsim::SystemTopology::addTearComponent)
363#ifdef WITH_GRAPHVIZ
364 .def("_repr_svg_", &DPsim::SystemTopology::render)
365 .def("render_to_file", &DPsim::SystemTopology::renderToFile)
366#endif
367 .def_readwrite("nodes", &DPsim::SystemTopology::mNodes)
368 .def_readwrite("components", &DPsim::SystemTopology::mComponents)
369 .def_readwrite("components_at_node",
371 .def_readonly("tear_components", &DPsim::SystemTopology::mTearComponents)
372 .def("list_idobjects", &DPsim::SystemTopology::listIdObjects)
373 .def("init_with_powerflow", &DPsim::SystemTopology::initWithPowerflow,
374 "systemPF"_a, "domain"_a)
375 .def("add_components", &DPsim::SystemTopology::addComponents)
376 .def("remove_component", &DPsim::SystemTopology::removeComponent);
377
378 py::class_<DPsim::Interface, std::shared_ptr<DPsim::Interface>>(m,
379 "Interface");
380
382 std::shared_ptr<DPsim::DataLoggerInterface>>(m,
383 "DataLoggerInterface")
384 .def("log_attribute",
385 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
388 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
390 .def("log_attribute",
391 py::overload_cast<const std::vector<CPS::String> &,
394 "names"_a, "attr"_a)
396 .def("log_attribute",
398 const std::vector<CPS::String> &names, const CPS::String &attr,
399 const CPS::IdentifiedObject &comp) {
400 logger.logAttribute(names, comp.attribute(attr));
401 });
402
404 std::shared_ptr<DPsim::DataLogger>>(m, "Logger")
405 .def(py::init<std::string>())
406 .def_static("set_log_dir", &CPS::Logger::setLogDir)
407 .def_static("get_log_dir", &CPS::Logger::logDir)
408 .def("log_attribute",
409 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
412 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
414 .def("log_attribute",
415 py::overload_cast<const std::vector<CPS::String> &,
418 "names"_a, "attr"_a)
420 .def(
421 "log_attribute",
422 [](DPsim::DataLogger &logger, const CPS::String &name,
423 const CPS::String &attr, const CPS::IdentifiedObject &comp,
424 CPS::UInt rowsMax, CPS::UInt colsMax) {
425 logger.logAttribute(name, comp.attribute(attr), rowsMax, colsMax);
426 },
427 "name"_a, "attr"_a, "comp"_a, "rows_max"_a = 0, "cols_max"_a = 0)
429 .def("log_attribute",
430 [](DPsim::DataLogger &logger, const std::vector<CPS::String> &names,
431 const CPS::String &attr, const CPS::IdentifiedObject &comp) {
432 logger.logAttribute(names, comp.attribute(attr));
433 });
434#ifdef WITH_RT
436 std::shared_ptr<DPsim::RealTimeDataLogger>>(m,
437 "RealTimeDataLogger")
438
439 .def(py::init([](py::object filename, DPsim::Real final_time,
440 DPsim::Real time_step) {
441 py::object fspath =
442 py::module_::import("os").attr("fspath")(filename);
443 std::string s = py::cast<std::string>(fspath);
444 std::filesystem::path p(s);
445 return std::make_shared<DPsim::RealTimeDataLogger>(p, final_time,
446 time_step);
447 }),
448 "filename"_a, "final_time"_a, "time_step"_a)
449
450 .def(py::init([](py::object filename, std::size_t row_number) {
451 py::object fspath =
452 py::module_::import("os").attr("fspath")(filename);
453 std::string s = py::cast<std::string>(fspath);
454 std::filesystem::path p(s);
455 return std::make_shared<DPsim::RealTimeDataLogger>(p, row_number);
456 }),
457 "filename"_a, "row_number"_a)
458
459 .def("log_attribute",
460 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
463 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
464
465 .def("log_attribute",
466 py::overload_cast<const std::vector<CPS::String> &,
469 "names"_a, "attr"_a)
470
471 .def(
472 "log_attribute",
473 [](DPsim::RealTimeDataLogger &logger, const CPS::String &name,
474 const CPS::String &attr, const CPS::IdentifiedObject &comp,
475 CPS::UInt rowsMax, CPS::UInt colsMax) {
476 logger.logAttribute(name, comp.attribute(attr), rowsMax, colsMax);
477 },
478 "name"_a, "attr"_a, "comp"_a, "rows_max"_a = 0, "cols_max"_a = 0)
479
480 .def(
481 "log_attribute",
482 [](DPsim::RealTimeDataLogger &logger,
483 const std::vector<CPS::String> &names, const CPS::String &attr,
484 const CPS::IdentifiedObject &comp) {
485 logger.logAttribute(names, comp.attribute(attr));
486 },
487 "names"_a, "attr"_a, "comp"_a);
488#endif
489
490 py::class_<CPS::IdentifiedObject, std::shared_ptr<CPS::IdentifiedObject>>(
491 m, "IdentifiedObject")
492 .def("name", &CPS::IdentifiedObject::name)
496 .def("attr", &CPS::IdentifiedObject::attribute, "name"_a)
497 .def("print_attribute_list", &printAttributes)
498 .def("print_attribute", &printAttribute, "attribute_name"_a)
499 .def("__str__", &getAttributeList);
500
501#ifdef WITH_CIM
502 py::enum_<CPS::CIM::Reader::VoltageTargetUnit>(m,
503 "CIMReaderVoltageTargetUnit")
507
508 py::class_<CPS::CIM::Reader>(m, "CIMReader")
509 .def(py::init<std::string, CPS::Logger::Level, CPS::Logger::Level>(),
510 "name"_a, "loglevel"_a = CPS::Logger::Level::info,
511 "comploglevel"_a = CPS::Logger::Level::off)
512 .def("loadCIM", (CPS::SystemTopology(CPS::CIM::Reader::*)(
513 CPS::Real, const std::list<CPS::String> &,
516 .def("set_extnet_voltage_target_unit",
518#endif
519
520 py::class_<CPS::CSVReader>(m, "CSVReader")
521 .def(py::init<std::string, const std::string &,
522 std::map<std::string, std::string> &, CPS::Logger::Level>())
523 .def("assignLoadProfile", &CPS::CSVReader::assignLoadProfile);
524
525 //Base Classes
526
527 py::class_<CPS::TopologicalPowerComp,
528 std::shared_ptr<CPS::TopologicalPowerComp>, CPS::IdentifiedObject>(
529 m, "TopologicalPowerComp");
530 py::class_<CPS::SimPowerComp<CPS::Complex>,
531 std::shared_ptr<CPS::SimPowerComp<CPS::Complex>>,
532 CPS::TopologicalPowerComp>(m, "SimPowerCompComplex")
534 .def("set_intf_current", &CPS::SimPowerComp<CPS::Complex>::setIntfCurrent)
535 .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Complex>::setIntfVoltage)
536 .def("get_terminal", &CPS::SimPowerComp<CPS::Complex>::terminal,
537 "index"_a);
538 py::class_<CPS::SimPowerComp<CPS::Real>,
539 std::shared_ptr<CPS::SimPowerComp<CPS::Real>>,
540 CPS::TopologicalPowerComp>(m, "SimPowerCompReal")
542 .def("set_intf_current", &CPS::SimPowerComp<CPS::Real>::setIntfCurrent)
543 .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Real>::setIntfVoltage)
544 .def("get_terminal", &CPS::SimPowerComp<CPS::Real>::terminal, "index"_a);
545 py::class_<CPS::TopologicalNode, std::shared_ptr<CPS::TopologicalNode>,
546 CPS::IdentifiedObject>(m, "TopologicalNode")
547 .def("initial_single_voltage",
549 "phase_type"_a = CPS::PhaseType::Single);
550
551 py::class_<CPS::TopologicalTerminal,
552 std::shared_ptr<CPS::TopologicalTerminal>, CPS::IdentifiedObject>(
553 m, "TopologicalTerminal")
554 .def("set_power",
555 py::overload_cast<CPS::Complex>(&CPS::TopologicalTerminal::setPower))
556 .def("set_power", py::overload_cast<CPS::MatrixComp>(
558
559 py::class_<CPS::SimTerminal<CPS::Complex>,
560 std::shared_ptr<CPS::SimTerminal<CPS::Complex>>,
561 CPS::TopologicalTerminal>(m, "SimTerminalComplex");
562 py::class_<CPS::SimTerminal<CPS::Real>,
563 std::shared_ptr<CPS::SimTerminal<CPS::Real>>,
564 CPS::TopologicalTerminal>(m, "SimTerminalReal");
565
566 //Events
567 py::module mEvent = m.def_submodule("event", "events");
568 py::class_<DPsim::Event, std::shared_ptr<DPsim::Event>>(mEvent, "Event");
569 py::class_<DPsim::SwitchEvent, std::shared_ptr<DPsim::SwitchEvent>,
570 DPsim::Event>(mEvent, "SwitchEvent", py::multiple_inheritance())
571 .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph1::Switch>,
572 CPS::Bool>());
573 py::class_<DPsim::SwitchEvent3Ph, std::shared_ptr<DPsim::SwitchEvent3Ph>,
574 DPsim::Event>(mEvent, "SwitchEvent3Ph", py::multiple_inheritance())
575 .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph3::Switch>,
576 CPS::Bool>());
577
578 //Components
579 py::module mBase = m.def_submodule("base", "base models");
580 addBaseComponents(mBase);
581
582 py::module mDP = m.def_submodule("dp", "dynamic phasor models");
583 addDPComponents(mDP);
584
585 py::module mEMT = m.def_submodule("emt", "electromagnetic-transient models");
586 addEMTComponents(mEMT);
587
588 py::module mSP = m.def_submodule("sp", "static phasor models");
589 mSP.attr("SimNode") = mDP.attr("SimNode");
590 addSPComponents(mSP);
591
592 py::module mSignal = m.def_submodule("signal", "signal models");
593 addSignalComponents(mSignal);
594
595#ifdef VERSION_INFO
596 m.attr("__version__") = VERSION_INFO;
597#else
598 m.attr("__version__") = "dev";
599#endif
600}
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
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