@@ -88,6 +88,11 @@ struct ODESystem <: AbstractODESystem
88
88
"""
89
89
defaults:: Dict
90
90
"""
91
+ The guesses to use as the initial conditions for the
92
+ initialization system.
93
+ """
94
+ guesses:: Dict
95
+ """
91
96
Tearing result specifying how to solve the system.
92
97
"""
93
98
torn_matching:: Union{Matching, Nothing}
@@ -157,7 +162,7 @@ struct ODESystem <: AbstractODESystem
157
162
parent:: Any
158
163
159
164
function ODESystem (tag, deqs, iv, dvs, ps, tspan, var_to_name, ctrls, observed, tgrad,
160
- jac, ctrl_jac, Wfact, Wfact_t, name, systems, defaults,
165
+ jac, ctrl_jac, Wfact, Wfact_t, name, systems, defaults, guesses,
161
166
torn_matching, connector_type, preface, cevents,
162
167
devents, parameter_dependencies, metadata = nothing , gui_metadata = nothing ,
163
168
tearing_state = nothing ,
@@ -175,7 +180,7 @@ struct ODESystem <: AbstractODESystem
175
180
check_units (u, deqs)
176
181
end
177
182
new (tag, deqs, iv, dvs, ps, tspan, var_to_name, ctrls, observed, tgrad, jac,
178
- ctrl_jac, Wfact, Wfact_t, name, systems, defaults, torn_matching,
183
+ ctrl_jac, Wfact, Wfact_t, name, systems, defaults, guesses, torn_matching,
179
184
connector_type, preface, cevents, devents, parameter_dependencies, metadata,
180
185
gui_metadata, tearing_state, substitutions, complete, index_cache,
181
186
discrete_subsystems, solved_unknowns, split_idxs, parent)
@@ -191,6 +196,7 @@ function ODESystem(deqs::AbstractVector{<:Equation}, iv, dvs, ps;
191
196
default_u0 = Dict (),
192
197
default_p = Dict (),
193
198
defaults = _merge (Dict (default_u0), Dict (default_p)),
199
+ guesses = Dict (),
194
200
connector_type = nothing ,
195
201
preface = nothing ,
196
202
continuous_events = nothing ,
@@ -217,6 +223,13 @@ function ODESystem(deqs::AbstractVector{<:Equation}, iv, dvs, ps;
217
223
var_to_name = Dict ()
218
224
process_variables! (var_to_name, defaults, dvs′)
219
225
process_variables! (var_to_name, defaults, ps′)
226
+
227
+ sysguesses = [ModelingToolkit. getguess (st) for st in dvs′]
228
+ hasaguess = findall (! isnothing, sysguesses)
229
+ var_guesses = dvs′[hasaguess] .=> sysguesses[hasaguess]
230
+ sysguesses = isempty (var_guesses) ? Dict () : todict (var_guesses)
231
+ guesses = merge (sysguesses, todict (guesses))
232
+
220
233
isempty (observed) || collect_var_to_name! (var_to_name, (eq. lhs for eq in observed))
221
234
222
235
tgrad = RefValue (EMPTY_TGRAD)
@@ -234,11 +247,12 @@ function ODESystem(deqs::AbstractVector{<:Equation}, iv, dvs, ps;
234
247
parameter_dependencies, ps′)
235
248
ODESystem (Threads. atomic_add! (SYSTEM_COUNT, UInt (1 )),
236
249
deqs, iv′, dvs′, ps′, tspan, var_to_name, ctrl′, observed, tgrad, jac,
237
- ctrl_jac, Wfact, Wfact_t, name, systems, defaults, nothing ,
250
+ ctrl_jac, Wfact, Wfact_t, name, systems, defaults, guesses, nothing ,
238
251
connector_type, preface, cont_callbacks, disc_callbacks, parameter_dependencies,
239
252
metadata, gui_metadata, checks = checks)
240
253
end
241
254
255
+
242
256
function ODESystem (eqs, iv; kwargs... )
243
257
eqs = collect (eqs)
244
258
# NOTE: this assumes that the order of algebraic equations doesn't matter
0 commit comments