forked from SciML/ModelingToolkit.jl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathelectrical_components.jl
98 lines (88 loc) · 2.52 KB
/
electrical_components.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using Test
using ModelingToolkit, OrdinaryDiffEq
@isdefined(t) || @parameters t
@connector function Pin(; name)
sts = @variables v(t)=1.0 i(t)=1.0 [connect = Flow]
ODESystem(Equation[], t, sts, []; name = name)
end
@component function Ground(; name)
@named g = Pin()
eqs = [g.v ~ 0]
compose(ODESystem(eqs, t, [], []; name = name), g)
end
@component function OnePort(; name)
@named p = Pin()
@named n = Pin()
sts = @variables v(t)=1.0 i(t)=1.0
eqs = [v ~ p.v - n.v
0 ~ p.i + n.i
i ~ p.i]
compose(ODESystem(eqs, t, sts, []; name = name), p, n)
end
@component function Resistor(; name, R = 1.0)
@named oneport = OnePort()
@unpack v, i = oneport
ps = @parameters R = R
eqs = [
v ~ i * R,
]
extend(ODESystem(eqs, t, [], ps; name = name), oneport)
end
@component function Capacitor(; name, C = 1.0)
@named oneport = OnePort()
@unpack v, i = oneport
ps = @parameters C = C
D = Differential(t)
eqs = [
D(v) ~ i / C,
]
extend(ODESystem(eqs, t, [], ps; name = name), oneport)
end
@component function ConstantVoltage(; name, V = 1.0)
@named oneport = OnePort()
@unpack v = oneport
ps = @parameters V = V
eqs = [
V ~ v,
]
extend(ODESystem(eqs, t, [], ps; name = name), oneport)
end
@component function Inductor(; name, L = 1.0)
@named oneport = OnePort()
@unpack v, i = oneport
ps = @parameters L = L
D = Differential(t)
eqs = [
D(i) ~ v / L,
]
extend(ODESystem(eqs, t, [], ps; name = name), oneport)
end
@connector function HeatPort(; name)
@variables T(t)=293.15 Q_flow(t)=0.0 [connect = Flow]
ODESystem(Equation[], t, [T, Q_flow], [], name = name)
end
@component function HeatingResistor(; name, R = 1.0, TAmbient = 293.15, alpha = 1.0)
@named p = Pin()
@named n = Pin()
@named h = HeatPort()
@variables v(t) RTherm(t)
@parameters R=R TAmbient=TAmbient alpha=alpha
eqs = [RTherm ~ R * (1 + alpha * (h.T - TAmbient))
v ~ p.i * RTherm
h.Q_flow ~ -v * p.i # -LossPower
v ~ p.v - n.v
0 ~ p.i + n.i]
compose(ODESystem(eqs, t, [v, RTherm], [R, TAmbient, alpha],
name = name), p, n, h)
end
@component function HeatCapacitor(; name, rho = 8050, V = 1, cp = 460, TAmbient = 293.15)
@parameters rho=rho V=V cp=cp
C = rho * V * cp
@named h = HeatPort()
D = Differential(t)
eqs = [
D(h.T) ~ h.Q_flow / C,
]
compose(ODESystem(eqs, t, [], [rho, V, cp],
name = name), h)
end