Skip to content

Commit 97d0e30

Browse files
Unify generate_jacobian
1 parent bd58adb commit 97d0e30

File tree

5 files changed

+28
-22
lines changed

5 files changed

+28
-22
lines changed

src/ModelingToolkit.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import MacroTools: splitdef, combinedef
99
abstract type Expression <: Number end
1010
abstract type AbstractOperation <: Expression end
1111
abstract type AbstractComponent <: Expression end
12-
abstract type AbstractSystem end
1312

1413
include("variables.jl")
1514

@@ -25,6 +24,7 @@ function caclulate_jacobian end
2524
include("operations.jl")
2625
include("differentials.jl")
2726
include("equations.jl")
27+
include("systems/systems.jl")
2828
include("systems/diffeqs/diffeqsystem.jl")
2929
include("systems/diffeqs/first_order_transform.jl")
3030
include("systems/nonlinear/nonlinear_system.jl")

src/systems/diffeqs/diffeqsystem.jl

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,9 @@ function calculate_jacobian(sys::DiffEqSystem, simplify=true)
7878
return jac
7979
end
8080

81-
function generate_ode_jacobian(sys::DiffEqSystem, simplify=true)
82-
var_exprs = [:($(sys.dvs[i].name) = u[$i]) for i in eachindex(sys.dvs)]
83-
param_exprs = [:($(sys.ps[i].name) = p[$i]) for i in eachindex(sys.ps)]
84-
jac = calculate_jacobian(sys, simplify)
85-
jac_exprs = [:(J[$i,$j] = $(convert(Expr, jac[i,j]))) for i in 1:size(jac,1), j in 1:size(jac,2)]
86-
exprs = vcat(var_exprs,param_exprs,vec(jac_exprs))
87-
block = expr_arr_to_block(exprs)
88-
:((J,u,p,t)->$(block))
89-
end
81+
system_vars(sys::DiffEqSystem) = sys.dvs
82+
system_params(sys::DiffEqSystem) = sys.ps
83+
9084

9185
function generate_ode_iW(sys::DiffEqSystem, simplify=true)
9286
var_exprs = [:($(sys.dvs[i].name) = u[$i]) for i in eachindex(sys.dvs)]

src/systems/nonlinear/nonlinear_system.jl

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,8 @@ function calculate_jacobian(sys::NonlinearSystem,simplify=true)
3434
sys_exprs
3535
end
3636

37-
function generate_nlsys_jacobian(sys::NonlinearSystem,simplify=true)
38-
var_exprs = [:($(sys.vs[i].name) = u[$i]) for i in 1:length(sys.vs)]
39-
param_exprs = [:($(sys.ps[i].name) = p[$i]) for i in 1:length(sys.ps)]
40-
jac = calculate_jacobian(sys,simplify)
41-
jac_exprs = [:(J[$i,$j] = $(convert(Expr, jac[i,j]))) for i in 1:size(jac,1), j in 1:size(jac,2)]
42-
exprs = vcat(var_exprs,param_exprs,vec(jac_exprs))
43-
block = expr_arr_to_block(exprs)
44-
:((J,u,p,t)->$(block))
45-
end
37+
system_vars(sys::NonlinearSystem) = sys.vs
38+
system_params(sys::NonlinearSystem) = sys.ps
4639

4740
export NonlinearSystem
4841
export generate_nlsys_function

src/systems/systems.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export generate_jacobian
2+
3+
4+
abstract type AbstractSystem end
5+
6+
7+
function system_vars end
8+
function system_params end
9+
10+
function generate_jacobian(sys::AbstractSystem, simplify = true)
11+
vs, ps = system_vars(sys), system_params(sys)
12+
var_exprs = [:($(vs[i].name) = u[$i]) for i in eachindex(vs)]
13+
param_exprs = [:($(ps[i].name) = p[$i]) for i in eachindex(ps)]
14+
jac = calculate_jacobian(sys, simplify)
15+
jac_exprs = [:(J[$i,$j] = $(convert(Expr, jac[i,j]))) for i in 1:size(jac,1), j in 1:size(jac,2)]
16+
exprs = vcat(var_exprs, param_exprs, vec(jac_exprs))
17+
block = expr_arr_to_block(exprs)
18+
:((J,u,p,t) -> $(block))
19+
end

test/system_construction.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ eqs = [D(x) ~ σ*(y-x),
1414
de = DiffEqSystem(eqs,t,[x,y,z],[σ,ρ,β])
1515
ModelingToolkit.generate_ode_function(de)
1616
ModelingToolkit.generate_ode_function(de;version=ModelingToolkit.SArrayFunction)
17-
jac_expr = ModelingToolkit.generate_ode_jacobian(de)
17+
jac_expr = generate_jacobian(de)
1818
jac = ModelingToolkit.calculate_jacobian(de)
1919
f = ODEFunction(de)
2020
ModelingToolkit.generate_ode_iW(de)
@@ -121,7 +121,7 @@ eqs = [0 ~ σ*(y-x),
121121
0 ~ x*y - β*z]
122122
ns = NonlinearSystem(eqs)
123123
nlsys_func = ModelingToolkit.generate_nlsys_function(ns)
124-
jac = ModelingToolkit.generate_nlsys_jacobian(ns)
124+
jac = generate_jacobian(ns)
125125
f = @eval eval(nlsys_func)
126126

127127
# Intermediate calculations
@@ -133,4 +133,4 @@ eqs = [a ~ y-x,
133133
ns = NonlinearSystem(eqs,[x,y,z],[σ,ρ,β])
134134
nlsys_func = ModelingToolkit.generate_nlsys_function(ns)
135135
jac = ModelingToolkit.calculate_jacobian(ns)
136-
jac = ModelingToolkit.generate_nlsys_jacobian(ns)
136+
jac = generate_jacobian(ns)

0 commit comments

Comments
 (0)