@@ -207,7 +207,7 @@ mutable struct TearingState{T <: AbstractSystem} <: AbstractTearingState{T}
207207 fullvars:: Vector
208208 structure:: SystemStructure
209209 extra_eqs:: Vector
210- param_derivative_map:: Dict{BasicSymbolic, Real }
210+ param_derivative_map:: Dict{BasicSymbolic, Any }
211211end
212212
213213TransformationState (sys:: AbstractSystem ) = TearingState (sys)
@@ -254,6 +254,11 @@ function Base.push!(ev::EquationsView, eq)
254254 push! (ev. ts. extra_eqs, eq)
255255end
256256
257+ function is_time_dependent_parameter (p, iv)
258+ return iv != = nothing && isparameter (p) && iscall (p) &&
259+ (args = arguments (p); length (args)) == 1 && isequal (only (args), iv)
260+ end
261+
257262function TearingState (sys; quick_cancel = false , check = true )
258263 sys = flatten (sys)
259264 ivs = independent_variables (sys)
@@ -265,7 +270,7 @@ function TearingState(sys; quick_cancel = false, check = true)
265270 var2idx = Dict {Any, Int} ()
266271 symbolic_incidence = []
267272 fullvars = []
268- param_derivative_map = Dict {BasicSymbolic, Real } ()
273+ param_derivative_map = Dict {BasicSymbolic, Any } ()
269274 var_counter = Ref (0 )
270275 var_types = VariableType[]
271276 addvar! = let fullvars = fullvars, var_counter = var_counter, var_types = var_types
@@ -278,11 +283,17 @@ function TearingState(sys; quick_cancel = false, check = true)
278283
279284 vars = OrderedSet ()
280285 varsvec = []
286+ eqs_to_retain = trues (length (eqs))
281287 for (i, eq′) in enumerate (eqs)
282288 if eq′. lhs isa Connection
283289 check ? error (" $(nameof (sys)) has unexpanded `connect` statements" ) :
284290 return nothing
285291 end
292+ if iscall (eq′. lhs) && (op = operation (eq′. lhs)) isa Differential &&
293+ isequal (op. x, iv) && is_time_dependent_parameter (only (arguments (eq′. lhs)), iv)
294+ param_derivative_map[eq′. lhs] = eq′. rhs
295+ eqs_to_retain[i] = false
296+ end
286297 if _iszero (eq′. lhs)
287298 rhs = quick_cancel ? quick_cancel_expr (eq′. rhs) : eq′. rhs
288299 eq = eq′
@@ -297,9 +308,11 @@ function TearingState(sys; quick_cancel = false, check = true)
297308 any (isequal (_var), ivs) && continue
298309 if isparameter (_var) ||
299310 (iscall (_var) && isparameter (operation (_var)) || isconstant (_var))
300- if iv != = nothing && isparameter (_var) && iscall (_var) &&
301- (args = arguments (_var); length (args)) == 1 && isequal (only (args), iv)
302- param_derivative_map[Differential (iv)(_var)] = 0.0
311+ if is_time_dependent_parameter (_var, iv) &&
312+ ! haskey (param_derivative_map, Differential (iv)(_var))
313+ # default to `nothing` since it is ignored during substitution,
314+ # so `D(_var)` is retained in the expression.
315+ param_derivative_map[Differential (iv)(_var)] = nothing
303316 end
304317 continue
305318 end
@@ -357,6 +370,9 @@ function TearingState(sys; quick_cancel = false, check = true)
357370 eqs[i] = eqs[i]. lhs ~ rhs
358371 end
359372 end
373+ eqs = eqs[eqs_to_retain]
374+ neqs = length (eqs)
375+ symbolic_incidence = symbolic_incidence[eqs_to_retain]
360376
361377 # ## Handle discrete variables
362378 lowest_shift = Dict ()
0 commit comments