@@ -292,8 +292,14 @@ function TearingState(sys; quick_cancel = false, check = true)
292292 end
293293 if iscall (eq′. lhs) && (op = operation (eq′. lhs)) isa Differential &&
294294 isequal (op. x, iv) && is_time_dependent_parameter (only (arguments (eq′. lhs)), iv)
295- param_derivative_map[eq′. lhs] = eq′. rhs
295+ # parameter derivatives are opted out by specifying `D(p) ~ missing`, but
296+ # we want to store `nothing` in the map because that means `fast_substitute`
297+ # will ignore the rule. We will this identify the presence of `eq′.lhs` in
298+ # the differentiated expression and error.
299+ param_derivative_map[eq′. lhs] = coalesce (eq′. rhs, nothing )
296300 eqs_to_retain[i] = false
301+ # change the equation if the RHS is `missing` so the rest of this loop works
302+ eq′ = eq′. lhs ~ coalesce (eq′. rhs, 0.0 )
297303 end
298304 if _iszero (eq′. lhs)
299305 rhs = quick_cancel ? quick_cancel_expr (eq′. rhs) : eq′. rhs
@@ -311,9 +317,9 @@ function TearingState(sys; quick_cancel = false, check = true)
311317 (iscall (_var) && isparameter (operation (_var)) || isconstant (_var))
312318 if is_time_dependent_parameter (_var, iv) &&
313319 ! haskey (param_derivative_map, Differential (iv)(_var))
314- # default to `nothing` since it is ignored during substitution,
315- # so `D(_var)` is retained in the expression.
316- param_derivative_map[Differential (iv)(_var)] = nothing
320+ # Parameter derivatives default to zero - they stay constant
321+ # between callbacks
322+ param_derivative_map[Differential (iv)(_var)] = 0.0
317323 end
318324 continue
319325 end
0 commit comments