@@ -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