@@ -207,7 +207,7 @@ mutable struct TearingState{T <: AbstractSystem} <: AbstractTearingState{T}
207
207
fullvars:: Vector
208
208
structure:: SystemStructure
209
209
extra_eqs:: Vector
210
- param_derivative_map:: Dict{BasicSymbolic, Real }
210
+ param_derivative_map:: Dict{BasicSymbolic, Any }
211
211
end
212
212
213
213
TransformationState (sys:: AbstractSystem ) = TearingState (sys)
@@ -254,6 +254,11 @@ function Base.push!(ev::EquationsView, eq)
254
254
push! (ev. ts. extra_eqs, eq)
255
255
end
256
256
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
+
257
262
function TearingState (sys; quick_cancel = false , check = true )
258
263
sys = flatten (sys)
259
264
ivs = independent_variables (sys)
@@ -265,7 +270,7 @@ function TearingState(sys; quick_cancel = false, check = true)
265
270
var2idx = Dict {Any, Int} ()
266
271
symbolic_incidence = []
267
272
fullvars = []
268
- param_derivative_map = Dict {BasicSymbolic, Real } ()
273
+ param_derivative_map = Dict {BasicSymbolic, Any } ()
269
274
var_counter = Ref (0 )
270
275
var_types = VariableType[]
271
276
addvar! = let fullvars = fullvars, var_counter = var_counter, var_types = var_types
@@ -278,11 +283,17 @@ function TearingState(sys; quick_cancel = false, check = true)
278
283
279
284
vars = OrderedSet ()
280
285
varsvec = []
286
+ eqs_to_retain = trues (length (eqs))
281
287
for (i, eq′) in enumerate (eqs)
282
288
if eq′. lhs isa Connection
283
289
check ? error (" $(nameof (sys)) has unexpanded `connect` statements" ) :
284
290
return nothing
285
291
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
286
297
if _iszero (eq′. lhs)
287
298
rhs = quick_cancel ? quick_cancel_expr (eq′. rhs) : eq′. rhs
288
299
eq = eq′
@@ -297,9 +308,11 @@ function TearingState(sys; quick_cancel = false, check = true)
297
308
any (isequal (_var), ivs) && continue
298
309
if isparameter (_var) ||
299
310
(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
303
316
end
304
317
continue
305
318
end
@@ -357,6 +370,9 @@ function TearingState(sys; quick_cancel = false, check = true)
357
370
eqs[i] = eqs[i]. lhs ~ rhs
358
371
end
359
372
end
373
+ eqs = eqs[eqs_to_retain]
374
+ neqs = length (eqs)
375
+ symbolic_incidence = symbolic_incidence[eqs_to_retain]
360
376
361
377
# ## Handle discrete variables
362
378
lowest_shift = Dict ()
0 commit comments