Skip to content

Commit a7e73f1

Browse files
committed
Zerocrossing parsing
1 parent b0ba70c commit a7e73f1

2 files changed

Lines changed: 39 additions & 20 deletions

File tree

src/odes/macros.jl

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,46 @@ macro model(expr::Expr)
1414
expr.head != :function && error("Expression is not a function definition!")
1515
args = getArguments(expr)
1616
func_name = shift!(args)
17+
c_vec = Vector{Expr}()
18+
a_vec = Vector{Expr}()
1719
f_vec = Vector{Expr}()
20+
zc_vec = Vector{Expr}()
21+
neg_vec = Vector{Expr}()
22+
pos_vec = Vector{Expr}()
1823
dx = expr.args[1].args[5]
24+
p = 0
1925
for ex in expr.args[2].args
20-
ex isa Expr && ex.head == Symbol("=") && ex.args[1] isa Expr && ex.args[1].head == :ref && ex.args[1].args[1] == dx && push!(f_vec, ex)
26+
if ex isa Expr
27+
if ex.head == Symbol("=")
28+
if ex.args[1] isa Expr && ex.args[1].head == :ref && ex.args[1].args[1] == dx
29+
push!(f_vec, ex)
30+
elseif ex.args[1] isa Symbol
31+
ex.args[2] isa Expr ? push!(a_vec, ex) : push!(c_vec, ex)
32+
end
33+
elseif ex isa Expr && ex.head == :if && ex.args[1].head == :call && ex.args[1].args[1] == :<
34+
push!(zc_vec, ex.args[1].args[2])
35+
push!(neg_vec, ex.args[2])
36+
length(ex.args) == 3 ? push!(pos_vec, ex.args[3]) : Expr()
37+
end
38+
end
2139
end
40+
println(zc_vec)
41+
println(neg_vec)
42+
println(pos_vec)
2243
n = length(f_vec)
2344
deps = zeros(Bool, n, n)
45+
param_deps = zeros(Bool, n, p)
46+
zc_deps = zeros(Bool, p, n)
2447
for ex in expr.args[2].args
2548
ex isa Expr && ex.head == Symbol("=") && ex.args[1] isa Expr && ex.args[1].head == :ref && ex.args[1].args[1] == dx && check_dependencies(ex.args[2], deps, ex.args[1].args[2], expr.args[1].args[3])
2649
end
2750
esc(:(function $func_name()
2851
f = Array{Function}($n)
29-
$((:(f[$(f_vec[i].args[1].args[2])] = ($(expr.args[1].args[2])::TaylorSeries.Taylor1, $(expr.args[1].args[3])::Vector{TaylorSeries.Taylor1}, $(expr.args[1].args[4])::Vector{Float64})->$(f_vec[i].args[2])) for i in 1:length(:($f_vec)))...)
52+
$((:(f[$(f_vec[i].args[1].args[2])] = ($(expr.args[1].args[2])::TaylorSeries.Taylor1, $(expr.args[1].args[3])::Vector{TaylorSeries.Taylor1}, $(expr.args[1].args[4])::Vector{Float64})->begin
53+
$((:($(c)) for c in :($c_vec))...)
54+
$((:($(a)) for a in :($a_vec))...)
55+
$(f_vec[i].args[2])
56+
end) for i in 1:length(:($f_vec)))...)
3057
Model(f, $deps)
3158
end))
3259
end

test/continuous.jl

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,21 @@ cont = @continuous diffeq(sim, [0.0, 20.0], [2020.0]; stiff=false, order=4)
1818
run(sim, 71)
1919

2020
@model function bouncing_ball(t, x, p, dx)
21-
dx[1] = x[3]
22-
dx[3] = zero(t)
23-
dx[2] = x[4]
24-
dx[4] = -9.81 + p[1]*(2.0e4/0.1*(x[2]-(3.0-ceil(evaluate(x[1])/0.2)*0.2)))
25-
end
26-
27-
@zerocrossing function contact(t, x, p, res)
28-
yf = 3.0 - ceil(x[1]/0.2)*0.2
29-
res = x[4] < 0.0 && x[2] - yf < 0.05
30-
if res
21+
g = 9.81
22+
m = 1.0
23+
b = 30.0
24+
k = 1.0e6
25+
if x[1] < 0.0
3126
p[1] = 1.0
32-
end
33-
end
34-
35-
@zerocrossing function up(t, x, p, res)
36-
yf = 3.0 - ceil(x[1]/0.2)*0.2
37-
res = x[4] > 0.0 && x[2] - yf > 0.05
38-
if res
27+
else
3928
p[1] = 0.0
4029
end
30+
f = k*x[1] + b*x[2]
31+
dx[1] = x[2]
32+
dx[2] = -g - p[1]*f/m
4133
end
4234

4335
sim = Simulation()
44-
cont = @continuous bouncing_ball(sim, [0.0, 3.05, 1.0, 0.0], [0.0])
36+
cont = @continuous bouncing_ball(sim, [2.0, 0.0], [0.0])
4537
@process report(sim, cont)
4638
run(sim, 5)

0 commit comments

Comments
 (0)