Skip to content

Commit e4f643e

Browse files
committed
Add checks for lengths of eqs, dvs, and u0
Fix #936
1 parent 8264144 commit e4f643e

File tree

4 files changed

+18
-6
lines changed

4 files changed

+18
-6
lines changed

src/systems/abstractsystem.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,3 +547,16 @@ Base.showerror(io::IO, e::InvalidSystemException) = print(io, "InvalidSystemExce
547547
AbstractTrees.children(sys::ModelingToolkit.AbstractSystem) = ModelingToolkit.get_systems(sys)
548548
AbstractTrees.printnode(io::IO, sys::ModelingToolkit.AbstractSystem) = print(io, nameof(sys))
549549
AbstractTrees.nodetype(::ModelingToolkit.AbstractSystem) = ModelingToolkit.AbstractSystem
550+
551+
function check_eqs_u0(eqs, dvs, u0)
552+
if u0 !== nothing
553+
if !(length(eqs) == length(dvs) == length(u0))
554+
throw(ArgumentError("Equations ($(length(eqs))), states ($(length(dvs))), and initial conditions ($(length(u0))) are of different lengths."))
555+
end
556+
else
557+
if !(length(eqs) == length(dvs))
558+
throw(ArgumentError("Equations ($(length(eqs))), states ($(length(dvs))) are of different lengths."))
559+
end
560+
end
561+
return nothing
562+
end

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -284,16 +284,15 @@ function process_DEProblem(constructor, sys::AbstractODESystem,u0map,parammap;
284284
linenumbers = true, parallel=SerialForm(),
285285
eval_expression = true,
286286
kwargs...)
287+
eqs = equations(sys)
287288
dvs = states(sys)
288289
ps = parameters(sys)
289290
defs = defaults(sys)
290291

291292
u0 = varmap_to_vars(u0map,dvs; defaults=defs)
292293
p = varmap_to_vars(parammap,ps; defaults=defs)
293294

294-
if u0 !== nothing
295-
length(dvs) == length(u0) || throw(ArgumentError("States ($(length(dvs))) and initial conditions ($(length(u0))) are of different lengths."))
296-
end
295+
check_eqs_u0(eqs, dvs, u0)
297296

298297
f = constructor(sys,dvs,ps,u0;tgrad=tgrad,jac=jac,checkbounds=checkbounds,
299298
linenumbers=linenumbers,parallel=parallel,simplify=simplify,

src/systems/nonlinear/nonlinearsystem.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,15 +204,14 @@ function process_NonlinearProblem(constructor, sys::NonlinearSystem,u0map,paramm
204204
linenumbers = true, parallel=SerialForm(),
205205
eval_expression = true,
206206
kwargs...)
207+
eqs = equations(sys)
207208
dvs = states(sys)
208209
ps = parameters(sys)
209210
defs = defaults(sys)
210211
u0 = varmap_to_vars(u0map,dvs; defaults=defs)
211212
p = varmap_to_vars(parammap,ps; defaults=defs)
212213

213-
if u0 !== nothing
214-
length(dvs) == length(u0) || throw(ArgumentError("States ($(length(dvs))) and initial conditions ($(length(u0))) are of different lengths."))
215-
end
214+
check_eqs_u0(eqs, dvs, u0)
216215

217216
f = constructor(sys,dvs,ps,u0;jac=jac,checkbounds=checkbounds,
218217
linenumbers=linenumbers,parallel=parallel,simplify=simplify,

test/nonlinearsystem.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ eqs1 = [
8787

8888
lorenz = name -> NonlinearSystem(eqs1, [x,y,z,u,F], [σ,ρ,β], name=name)
8989
lorenz1 = lorenz(:lorenz1)
90+
@test_throws ArgumentError NonlinearProblem(lorenz1, zeros(5))
9091
lorenz2 = lorenz(:lorenz2)
9192
connected = NonlinearSystem([s ~ a + lorenz1.x
9293
lorenz2.y ~ s

0 commit comments

Comments
 (0)