Skip to content

Commit c1cd3d4

Browse files
committed
[wip] pretty print system
1 parent aa5c4de commit c1cd3d4

File tree

4 files changed

+115
-5
lines changed

4 files changed

+115
-5
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ authors = ["Chris Rackauckas <[email protected]>"]
44
version = "5.13.6"
55

66
[deps]
7+
AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
78
ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
89
ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
910
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
@@ -35,11 +36,11 @@ SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
3536
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
3637
SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b"
3738
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
38-
TreeViews = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7"
3939
UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
4040
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
4141

4242
[compat]
43+
AbstractTrees = "0.3"
4344
ArrayInterface = "2.8, 3.0"
4445
ConstructionBase = "1"
4546
DataStructures = "0.17, 0.18"
@@ -66,7 +67,6 @@ SpecialFunctions = "0.7, 0.8, 0.9, 0.10, 1.0"
6667
StaticArrays = "0.10, 0.11, 0.12, 1.0"
6768
SymbolicUtils = "0.8.3, 0.9"
6869
Symbolics = "0.1.8"
69-
TreeViews = "0.3"
7070
UnPack = "0.1, 1.0"
7171
Unitful = "1.1"
7272
julia = "1.2"

src/ModelingToolkit.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ $(DocStringExtensions.README)
33
"""
44
module ModelingToolkit
55
using DocStringExtensions
6-
6+
using AbstractTrees
77
using DiffEqBase, SciMLBase, Reexport
88
using Distributed
99
using StaticArrays, LinearAlgebra, SparseArrays, LabelledArrays
@@ -54,8 +54,6 @@ import DiffEqBase: @add_kwonly
5454

5555
import LightGraphs: SimpleDiGraph, add_edge!
5656

57-
import TreeViews
58-
5957
using Requires
6058

6159
for fun in [:toexpr]

src/systems/abstractsystem.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,3 +539,7 @@ struct InvalidSystemException <: Exception
539539
msg::String
540540
end
541541
Base.showerror(io::IO, e::InvalidSystemException) = print(io, "InvalidSystemException: ", e.msg)
542+
543+
AbstractTrees.children(sys::ModelingToolkit.AbstractSystem) = ModelingToolkit.get_systems(sys)
544+
AbstractTrees.printnode(io::IO, sys::ModelingToolkit.AbstractSystem) = print(io, nameof(sys))
545+
AbstractTrees.nodetype(::ModelingToolkit.AbstractSystem) = ModelingToolkit.AbstractSystem

test/tree_print.jl

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
2+
using ModelingToolkit, AbstractTrees, Test
3+
4+
@parameters t
5+
6+
# Basic electric components
7+
function Pin(;name)
8+
@variables v(t) i(t)
9+
ODESystem(Equation[], t, [v, i], [], name=name, defaults=[v=>1.0, i=>1.0])
10+
end
11+
12+
function Ground(;name)
13+
@named g = Pin()
14+
eqs = [g.v ~ 0]
15+
ODESystem(eqs, t, [], [], systems=[g], name=name)
16+
end
17+
18+
function Resistor(;name, R = 1.0)
19+
val = R
20+
@named p = Pin()
21+
@named n = Pin()
22+
@variables v(t)
23+
@parameters R
24+
eqs = [
25+
v ~ p.v - n.v
26+
0 ~ p.i + n.i
27+
v ~ p.i * R
28+
]
29+
ODESystem(eqs, t, [v], [R], systems=[p, n], defaults=Dict(R => val), name=name)
30+
end
31+
32+
function Capacitor(; name, C = 1.0)
33+
val = C
34+
@named p = Pin()
35+
@named n = Pin()
36+
@variables v(t)
37+
@parameters C
38+
D = Differential(t)
39+
eqs = [
40+
v ~ p.v - n.v
41+
0 ~ p.i + n.i
42+
D(v) ~ p.i / C
43+
]
44+
ODESystem(eqs, t, [v], [C], systems=[p, n], defaults=Dict(C => val), name=name)
45+
end
46+
47+
function ConstantVoltage(;name, V = 1.0)
48+
val = V
49+
@named p = Pin()
50+
@named n = Pin()
51+
@parameters V
52+
eqs = [
53+
V ~ p.v - n.v
54+
0 ~ p.i + n.i
55+
]
56+
ODESystem(eqs, t, [], [V], systems=[p, n], defaults=Dict(V => val), name=name)
57+
end
58+
59+
R = 1.0
60+
C = 1.0
61+
V = 1.0
62+
@named resistor = Resistor(R=R)
63+
@named capacitor = Capacitor(C=C)
64+
@named source = ConstantVoltage(V=V)
65+
@named ground = Ground()
66+
67+
function connect_pins(ps...)
68+
eqs = [
69+
0 ~ sum(p->p.i, ps) # KCL
70+
]
71+
# KVL
72+
for i in 1:length(ps)-1
73+
push!(eqs, ps[i].v ~ ps[i+1].v)
74+
end
75+
76+
return eqs
77+
end
78+
79+
rc_eqs = [
80+
connect_pins(source.p, resistor.p)
81+
connect_pins(resistor.n, capacitor.p)
82+
connect_pins(capacitor.n, source.n, ground.g)
83+
]
84+
85+
@named rc_model = ODESystem(rc_eqs, t,
86+
systems=[resistor, capacitor, source, ground])
87+
88+
open("rc_tree.txt", "w") do io
89+
print_tree(io, rc_model)
90+
end;
91+
92+
str =
93+
"""rc_model
94+
├─ resistor
95+
│ ├─ p
96+
│ └─ n
97+
├─ capacitor
98+
│ ├─ p
99+
│ └─ n
100+
├─ source
101+
│ ├─ p
102+
│ └─ n
103+
└─ ground
104+
└─ g
105+
"""
106+
@test read("rc_tree.txt", String) == str
107+
108+
rm("rc_tree.txt")

0 commit comments

Comments
 (0)