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 py::enum_<DPsim::StateSpacePoleMapping>(m, "StateSpacePoleMapping")
169 .value("Logarithmic", DPsim::StateSpacePoleMapping::Logarithmic);
170
171 m.attr("RMS3PH_TO_PEAK1PH") = RMS3PH_TO_PEAK1PH;
172 m.attr("PEAK1PH_TO_RMS3PH") = PEAK1PH_TO_RMS3PH;
173 m.attr("P_SNUB_TRANSFORMER") = P_SNUB_TRANSFORMER;
174 m.attr("Q_SNUB_TRANSFORMER") = Q_SNUB_TRANSFORMER;
175 m.attr("DOUBLE_EPSILON") = DOUBLE_EPSILON;
176
177 addAttributes(m);
178
179 py::class_<DPsim::DirectLinearSolverConfiguration>(
180 m, "DirectLinearSolverConfiguration")
181 .def(py::init<>())
182 .def("set_fill_in_reduction_method",
184 .def("set_scaling_method",
186 .def("set_partial_refactorization_method",
188 setPartialRefactorizationMethod)
190 .def("get_scaling_method",
192 .def("get_fill_in_reduction_method",
194 .def("get_partial_refactorization_method",
196 getPartialRefactorizationMethod)
198
199 py::class_<DPsim::MNAStateSpaceExtractor>(m, "MNAStateSpaceExtractor")
200 .def("is_initialized", &DPsim::MNAStateSpaceExtractor::isInitialized)
201 .def("get_state_count", &DPsim::MNAStateSpaceExtractor::getStateCount)
202 .def("get_time_step", &DPsim::MNAStateSpaceExtractor::getTimeStep)
203 .def("get_discrete_state_matrix",
205 py::return_value_policy::reference_internal);
206
207 py::class_<DPsim::StateSpaceModalAnalysis>(m, "StateSpaceModalAnalysis")
208 .def(py::init<const DPsim::MNAStateSpaceExtractor &>(),
209 py::keep_alive<1, 2>())
210 .def("set_analysis_frame",
212 .def("set_global_dq0_frame",
214 "theta0"_a = 0.0)
215 .def("set_pole_mapping", &DPsim::StateSpaceModalAnalysis::setPoleMapping)
217 .def("get_discrete_eigenvalues",
219 py::return_value_policy::reference_internal)
220 .def("get_continuous_eigenvalues",
222 py::return_value_policy::reference_internal)
223 .def("get_right_eigenvectors",
225 py::return_value_policy::reference_internal)
226 .def("get_left_eigenvectors",
228 py::return_value_policy::reference_internal)
229 .def("get_participation_factors",
231 py::return_value_policy::reference_internal)
232 .def("get_state_names", &DPsim::StateSpaceModalAnalysis::getStateNames,
233 py::return_value_policy::reference_internal);
234
235 py::class_<DPsim::Simulation>(m, "Simulation")
236 .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
237 "loglevel"_a = CPS::Logger::Level::off)
238 .def("name", &DPsim::Simulation::name)
239 .def("set_time_step", &DPsim::Simulation::setTimeStep)
240 .def("set_final_time", &DPsim::Simulation::setFinalTime)
241 .def("add_logger", &DPsim::Simulation::addLogger)
242 .def("set_system", &DPsim::Simulation::setSystem)
243 .def("run", &DPsim::Simulation::run)
244 .def("set_solver", &DPsim::Simulation::setSolverType)
245 .def("set_pf_keep_last_solution",
247 .def("get_pf_keep_last_solution",
249 .def("set_pf_base_apparent_power_fallback",
251 .def("get_pf_base_apparent_power_fallback",
253 .def("set_pf_max_iterations", &DPsim::Simulation::setPFMaxIterations)
254 .def("get_pf_max_iterations", &DPsim::Simulation::getPFMaxIterations)
255 .def("set_pf_solver_use_sparse", &DPsim::Simulation::setPFSolverUseSparse)
256 .def("get_pf_solver_use_sparse", &DPsim::Simulation::getPFSolverUseSparse)
257 .def("set_pf_solver_enforce_q_limits",
259 .def("get_pf_solver_enforce_q_limits",
261 .def("set_pf_solver_base_voltage_loose_tolerance",
263 .def("get_pf_solver_base_voltage_loose_tolerance",
265 .def("set_pf_solver_base_voltage_strict_tolerance",
267 .def("get_pf_solver_base_voltage_strict_tolerance",
269 .def("set_domain", &DPsim::Simulation::setDomain)
270 .def("start", &DPsim::Simulation::start)
271 .def("next", &DPsim::Simulation::next)
272 .def("stop", &DPsim::Simulation::stop)
273 .def("get_idobj_attr", &DPsim::Simulation::getIdObjAttribute, "comp"_a,
274 "attr"_a)
275 .def("add_interface", &DPsim::Simulation::addInterface, "interface"_a)
276 .def("log_idobj_attribute", &DPsim::Simulation::logIdObjAttribute,
277 "comp"_a, "attr"_a)
278 .def("log_attribute", &DPsim::Simulation::logAttribute, "name"_a,
279 "attr"_a)
280 .def("do_init_from_nodes_and_terminals",
282 .def("set_system_matrix_recomputation_mode",
284 .def("do_system_matrix_recomputation",
286 .def("do_state_space_extraction",
288 py::arg_v("value", true, "True"))
289 .def("get_state_space_extractor",
290 &DPsim::Simulation::getStateSpaceExtractor, "solver_index"_a = 0,
291 py::return_value_policy::reference_internal)
292 .def("do_steady_state_init", &DPsim::Simulation::doSteadyStateInit)
293 .def("do_frequency_parallelization",
295 .def("do_split_subnets", &DPsim::Simulation::doSplitSubnets)
296 .def("set_tearing_components", &DPsim::Simulation::setTearingComponents)
297 .def("add_event", &DPsim::Simulation::addEvent)
298 .def("set_solver_component_behaviour",
300 .def("set_direct_solver_implementation",
302 .def("set_direct_linear_solver_configuration",
304 .def("log_lu_times", &DPsim::Simulation::logLUTimes);
305
306#ifdef WITH_RT
307 py::class_<DPsim::RealTimeSimulation, DPsim::Simulation>(m,
308 "RealTimeSimulation")
309 .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
310 "loglevel"_a = CPS::Logger::Level::info)
312 .def("set_time_step", &DPsim::RealTimeSimulation::setTimeStep)
313 .def("set_final_time", &DPsim::RealTimeSimulation::setFinalTime)
314 .def("add_logger", &DPsim::RealTimeSimulation::addLogger)
315 .def("set_system", &DPsim::RealTimeSimulation::setSystem)
316 .def("run",
317 static_cast<void (DPsim::RealTimeSimulation::*)(CPS::Int startIn)>(
320 .def("set_domain", &DPsim::RealTimeSimulation::setDomain);
321#endif
322
323 py::class_<CPS::SystemTopology, std::shared_ptr<CPS::SystemTopology>>(
324 m, "SystemTopology")
329 .def(py::init<CPS::Real>())
330 .def("add_component", &DPsim::SystemTopology::addComponent)
331 .def("add_component", &DPsim::SystemTopology::addComponents)
332 .def("add_node", &DPsim::SystemTopology::addNode)
333 // Deprecated alias for add_component/add_node, kept so that scripts
334 // written before the rename keep working
335 .def(
336 "add",
337 [](DPsim::SystemTopology &sys, const py::object &obj) {
338 if (PyErr_WarnEx(PyExc_DeprecationWarning,
339 "SystemTopology.add is deprecated; use "
340 "add_component for components and add_node "
341 "for nodes instead.",
342 1) == -1)
343 throw py::error_already_set();
344
345 if (py::isinstance<py::list>(obj) ||
346 py::isinstance<py::tuple>(obj)) {
347 for (const py::handle &item : obj)
348 systemTopologyAddSingle(sys, item);
349 } else {
350 systemTopologyAddSingle(sys, obj);
351 }
352 },
353 "Deprecated alias for add_component and add_node.")
354 .def("node", py::overload_cast<std::string_view>(
356 .def("node", py::overload_cast<CPS::UInt>(
358 .def("connect_component",
359 py::overload_cast<CPS::SimPowerComp<CPS::Real>::Ptr,
362 .def("connect_component",
363 py::overload_cast<CPS::SimPowerComp<CPS::Complex>::Ptr,
366 .def("component",
368 .def("add_tear_component", &DPsim::SystemTopology::addTearComponent)
369#ifdef WITH_GRAPHVIZ
370 .def("_repr_svg_", &DPsim::SystemTopology::render)
371 .def("render_to_file", &DPsim::SystemTopology::renderToFile)
372#endif
373 .def_readwrite("nodes", &DPsim::SystemTopology::mNodes)
374 .def_readwrite("components", &DPsim::SystemTopology::mComponents)
375 .def_property_readonly("components_at_node",
376 [](DPsim::SystemTopology &sys) {
377 // Derived view: rebuild before every read (see #635)
379 return sys.mComponentsAtNode;
380 })
381 .def_readonly("tear_components", &DPsim::SystemTopology::mTearComponents)
382 .def("list_idobjects", &DPsim::SystemTopology::listIdObjects)
383 .def("init_with_powerflow", &DPsim::SystemTopology::initWithPowerflow,
384 "systemPF"_a, "domain"_a)
385 .def("add_components", &DPsim::SystemTopology::addComponents)
386 .def("remove_component", &DPsim::SystemTopology::removeComponent)
387 .def("remove_node", &DPsim::SystemTopology::removeNode);
388
389 py::class_<DPsim::Interface, std::shared_ptr<DPsim::Interface>>(m,
390 "Interface");
391
393 std::shared_ptr<DPsim::DataLoggerInterface>>(m,
394 "DataLoggerInterface")
395 .def("log_attribute",
396 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
399 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
401 .def("log_attribute",
402 py::overload_cast<const std::vector<CPS::String> &,
405 "names"_a, "attr"_a)
407 .def("log_attribute",
409 const std::vector<CPS::String> &names, const CPS::String &attr,
410 const CPS::IdentifiedObject &comp) {
411 logger.logAttribute(names, comp.attribute(attr));
412 });
413
415 std::shared_ptr<DPsim::DataLogger>>(m, "Logger")
416 .def(py::init<std::string>())
417 .def_static("set_log_dir", &CPS::Logger::setLogDir)
418 .def_static("get_log_dir", &CPS::Logger::logDir)
419 .def("log_attribute",
420 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
423 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
425 .def("log_attribute",
426 py::overload_cast<const std::vector<CPS::String> &,
429 "names"_a, "attr"_a)
431 .def(
432 "log_attribute",
433 [](DPsim::DataLogger &logger, const CPS::String &name,
434 const CPS::String &attr, const CPS::IdentifiedObject &comp,
435 CPS::UInt rowsMax, CPS::UInt colsMax) {
436 logger.logAttribute(name, comp.attribute(attr), rowsMax, colsMax);
437 },
438 "name"_a, "attr"_a, "comp"_a, "rows_max"_a = 0, "cols_max"_a = 0)
440 .def("log_attribute",
441 [](DPsim::DataLogger &logger, const std::vector<CPS::String> &names,
442 const CPS::String &attr, const CPS::IdentifiedObject &comp) {
443 logger.logAttribute(names, comp.attribute(attr));
444 });
445#ifdef WITH_RT
447 std::shared_ptr<DPsim::RealTimeDataLogger>>(m,
448 "RealTimeDataLogger")
449
450 .def(py::init([](py::object filename, DPsim::Real final_time,
451 DPsim::Real time_step) {
452 py::object fspath =
453 py::module_::import("os").attr("fspath")(filename);
454 std::string s = py::cast<std::string>(fspath);
455 std::filesystem::path p(s);
456 return std::make_shared<DPsim::RealTimeDataLogger>(p, final_time,
457 time_step);
458 }),
459 "filename"_a, "final_time"_a, "time_step"_a)
460
461 .def(py::init([](py::object filename, std::size_t row_number) {
462 py::object fspath =
463 py::module_::import("os").attr("fspath")(filename);
464 std::string s = py::cast<std::string>(fspath);
465 std::filesystem::path p(s);
466 return std::make_shared<DPsim::RealTimeDataLogger>(p, row_number);
467 }),
468 "filename"_a, "row_number"_a)
469
470 .def("log_attribute",
471 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
474 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
475
476 .def("log_attribute",
477 py::overload_cast<const std::vector<CPS::String> &,
480 "names"_a, "attr"_a)
481
482 .def(
483 "log_attribute",
484 [](DPsim::RealTimeDataLogger &logger, const CPS::String &name,
485 const CPS::String &attr, const CPS::IdentifiedObject &comp,
486 CPS::UInt rowsMax, CPS::UInt colsMax) {
487 logger.logAttribute(name, comp.attribute(attr), rowsMax, colsMax);
488 },
489 "name"_a, "attr"_a, "comp"_a, "rows_max"_a = 0, "cols_max"_a = 0)
490
491 .def(
492 "log_attribute",
493 [](DPsim::RealTimeDataLogger &logger,
494 const std::vector<CPS::String> &names, const CPS::String &attr,
495 const CPS::IdentifiedObject &comp) {
496 logger.logAttribute(names, comp.attribute(attr));
497 },
498 "names"_a, "attr"_a, "comp"_a);
499#endif
500
501 py::class_<CPS::IdentifiedObject, std::shared_ptr<CPS::IdentifiedObject>>(
502 m, "IdentifiedObject")
503 .def("name", &CPS::IdentifiedObject::name)
507 .def("attr", &CPS::IdentifiedObject::attribute, "name"_a)
508 .def("print_attribute_list", &printAttributes)
509 .def("print_attribute", &printAttribute, "attribute_name"_a)
510 .def("__str__", &getAttributeList);
511
512#ifdef WITH_CIM
513 py::enum_<CPS::CIM::Reader::VoltageTargetUnit>(m,
514 "CIMReaderVoltageTargetUnit")
518
519 py::class_<CPS::CIM::Reader>(m, "CIMReader")
520 .def(py::init<std::string, CPS::Logger::Level, CPS::Logger::Level>(),
521 "name"_a, "loglevel"_a = CPS::Logger::Level::info,
522 "comploglevel"_a = CPS::Logger::Level::off)
523 .def("loadCIM", (CPS::SystemTopology(CPS::CIM::Reader::*)(
524 CPS::Real, const std::list<CPS::String> &,
527 .def("set_extnet_voltage_target_unit",
529#endif
530
531 py::class_<CPS::CSVReader>(m, "CSVReader")
532 .def(py::init<std::string, const std::string &,
533 std::map<std::string, std::string> &, CPS::Logger::Level>())
534 .def("assignLoadProfile", &CPS::CSVReader::assignLoadProfile);
535
536 //Base Classes
537
538 py::class_<CPS::TopologicalPowerComp,
539 std::shared_ptr<CPS::TopologicalPowerComp>, CPS::IdentifiedObject>(
540 m, "TopologicalPowerComp");
541 py::class_<CPS::SimPowerComp<CPS::Complex>,
542 std::shared_ptr<CPS::SimPowerComp<CPS::Complex>>,
543 CPS::TopologicalPowerComp>(m, "SimPowerCompComplex")
545 .def("set_intf_current", &CPS::SimPowerComp<CPS::Complex>::setIntfCurrent)
546 .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Complex>::setIntfVoltage)
547 .def("get_terminal", &CPS::SimPowerComp<CPS::Complex>::terminal,
548 "index"_a);
549 py::class_<CPS::SimPowerComp<CPS::Real>,
550 std::shared_ptr<CPS::SimPowerComp<CPS::Real>>,
551 CPS::TopologicalPowerComp>(m, "SimPowerCompReal")
553 .def("set_intf_current", &CPS::SimPowerComp<CPS::Real>::setIntfCurrent)
554 .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Real>::setIntfVoltage)
555 .def("get_terminal", &CPS::SimPowerComp<CPS::Real>::terminal, "index"_a);
556 py::class_<CPS::TopologicalNode, std::shared_ptr<CPS::TopologicalNode>,
557 CPS::IdentifiedObject>(m, "TopologicalNode")
558 .def("initial_single_voltage",
560 "phase_type"_a = CPS::PhaseType::Single);
561
562 py::class_<CPS::TopologicalTerminal,
563 std::shared_ptr<CPS::TopologicalTerminal>, CPS::IdentifiedObject>(
564 m, "TopologicalTerminal")
565 .def("set_power",
566 py::overload_cast<CPS::Complex>(&CPS::TopologicalTerminal::setPower))
567 .def("set_power", py::overload_cast<CPS::MatrixComp>(
569
570 py::class_<CPS::SimTerminal<CPS::Complex>,
571 std::shared_ptr<CPS::SimTerminal<CPS::Complex>>,
572 CPS::TopologicalTerminal>(m, "SimTerminalComplex");
573 py::class_<CPS::SimTerminal<CPS::Real>,
574 std::shared_ptr<CPS::SimTerminal<CPS::Real>>,
575 CPS::TopologicalTerminal>(m, "SimTerminalReal");
576
577 //Events
578 py::module mEvent = m.def_submodule("event", "events");
579 py::class_<DPsim::Event, std::shared_ptr<DPsim::Event>>(mEvent, "Event");
580 py::class_<DPsim::SwitchEvent, std::shared_ptr<DPsim::SwitchEvent>,
581 DPsim::Event>(mEvent, "SwitchEvent", py::multiple_inheritance())
582 .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph1::Switch>,
583 CPS::Bool>());
584 py::class_<DPsim::SwitchEvent3Ph, std::shared_ptr<DPsim::SwitchEvent3Ph>,
585 DPsim::Event>(mEvent, "SwitchEvent3Ph", py::multiple_inheritance())
586 .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph3::Switch>,
587 CPS::Bool>());
588
589 //Components
590 py::module mBase = m.def_submodule("base", "base models");
591 addBaseComponents(mBase);
592
593 py::module mDP = m.def_submodule("dp", "dynamic phasor models");
594 addDPComponents(mDP);
595
596 py::module mEMT = m.def_submodule("emt", "electromagnetic-transient models");
597 addEMTComponents(mEMT);
598
599 py::module mSP = m.def_submodule("sp", "static phasor models");
600 mSP.attr("SimNode") = mDP.attr("SimNode");
601 addSPComponents(mSP);
602
603 py::module mSignal = m.def_submodule("signal", "signal models");
604 addSignalComponents(mSignal);
605
606#ifdef VERSION_INFO
607 m.attr("__version__") = VERSION_INFO;
608#else
609 m.attr("__version__") = "dev";
610#endif
611}
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
const CPS::VectorComp & getDiscreteEigenvalues() const
Eigenvalues of the extracted discrete-time state matrix in the selected analysis frame.
void setPoleMapping(StateSpacePoleMapping mapping)
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