Skip to content

Commit dc98d54

Browse files
Merge pull request #2960 from aml5600/fix/add-checks-false-initialization
kwarg to disable unit checking in `InitializationProblem`
2 parents 9938994 + 5e7f048 commit dc98d54

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
782782
build_initializeprob = true,
783783
initialization_eqs = [],
784784
fully_determined = false,
785+
check_units = true,
785786
kwargs...)
786787
eqs = equations(sys)
787788
dvs = unknowns(sys)
@@ -820,7 +821,7 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
820821
end
821822
initializeprob = ModelingToolkit.InitializationProblem(
822823
sys, t, u0map, parammap; guesses, warn_initialize_determined,
823-
initialization_eqs, eval_expression, eval_module, fully_determined)
824+
initialization_eqs, eval_expression, eval_module, fully_determined, check_units)
824825
initializeprobmap = getu(initializeprob, unknowns(sys))
825826

826827
zerovars = Dict(setdiff(unknowns(sys), keys(defaults(sys))) .=> 0.0)
@@ -1430,18 +1431,19 @@ function InitializationProblem{iip, specialize}(sys::AbstractODESystem,
14301431
warn_initialize_determined = true,
14311432
initialization_eqs = [],
14321433
fully_determined = false,
1434+
check_units = true,
14331435
kwargs...) where {iip, specialize}
14341436
if !iscomplete(sys)
14351437
error("A completed system is required. Call `complete` or `structural_simplify` on the system before creating an `ODEProblem`")
14361438
end
14371439
if isempty(u0map) && get_initializesystem(sys) !== nothing
1438-
isys = get_initializesystem(sys; initialization_eqs)
1440+
isys = get_initializesystem(sys; initialization_eqs, check_units)
14391441
elseif isempty(u0map) && get_initializesystem(sys) === nothing
14401442
isys = structural_simplify(
1441-
generate_initializesystem(sys; initialization_eqs); fully_determined)
1443+
generate_initializesystem(sys; initialization_eqs, check_units); fully_determined)
14421444
else
14431445
isys = structural_simplify(
1444-
generate_initializesystem(sys; u0map, initialization_eqs); fully_determined)
1446+
generate_initializesystem(sys; u0map, initialization_eqs, check_units); fully_determined)
14451447
end
14461448

14471449
uninit = setdiff(unknowns(sys), [unknowns(isys); getfield.(observed(isys), :lhs)])

src/systems/nonlinear/initializesystem.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ function generate_initializesystem(sys::ODESystem;
1010
default_dd_value = 0.0,
1111
algebraic_only = false,
1212
initialization_eqs = [],
13+
check_units = true,
1314
kwargs...)
1415
sts, eqs = unknowns(sys), equations(sys)
1516
idxs_diff = isdiffeq.(eqs)
@@ -102,6 +103,7 @@ function generate_initializesystem(sys::ODESystem;
102103
pars;
103104
defaults = merge(ModelingToolkit.defaults(sys), todict(u0), dd_guess),
104105
parameter_dependencies = parameter_dependencies(sys),
106+
checks = check_units,
105107
name,
106108
kwargs...)
107109

test/dq_units.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,28 @@ end
185185

186186
@named sys = ArrayParamTest(a = [1.0, 3.0]u"cm")
187187
@test ModelingToolkit.getdefault(sys.a) [0.01, 0.03]
188+
189+
@testset "Initialization checks" begin
190+
@mtkmodel PendulumUnits begin
191+
@parameters begin
192+
g, [unit = u"m/s^2"]
193+
L, [unit = u"m"]
194+
end
195+
@variables begin
196+
x(t), [unit = u"m"]
197+
y(t), [state_priority = 10, unit = u"m"]
198+
λ(t), [unit = u"s^-2"]
199+
end
200+
@equations begin
201+
D(D(x)) ~ λ * x
202+
D(D(y)) ~ λ * y - g
203+
x^2 + y^2 ~ L^2
204+
end
205+
end
206+
@mtkbuild pend = PendulumUnits()
207+
u0 = [pend.x => 1.0, pend.y => 0.0]
208+
p = [pend.g => 1.0, pend.L => 1.0]
209+
guess = [pend.λ => 0.0]
210+
@test prob = ODEProblem(
211+
pend, u0, (0.0, 1.0), p; guesses = guess, check_units = false) isa Any
212+
end

0 commit comments

Comments
 (0)