@@ -213,8 +213,8 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
213
213
possible_x_t[rhs] = i, lhs
214
214
end
215
215
216
- removed_eqs = Int[]
217
- removed_vars = Int[]
216
+ # removed_eqs = Int[]
217
+ # removed_vars = Int[]
218
218
removed_obs = Int[]
219
219
diff_to_var = invview (var_to_diff)
220
220
for var in 1 : length (fullvars)
@@ -423,6 +423,12 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
423
423
empty! (subs)
424
424
end
425
425
426
+ # Will reorder equations and states to be:
427
+ # [diffeqs; ...]
428
+ # [diffvars; ...]
429
+ # such that the mass matrix is:
430
+ # [I 0
431
+ # 0 0].
426
432
diffeq_idxs = Int[]
427
433
algeeq_idxs = Int[]
428
434
diff_eqs = Equation[]
@@ -431,7 +437,6 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
431
437
subeqs = Equation[]
432
438
solved_equations = Int[]
433
439
solved_variables = Int[]
434
- idx = 0
435
440
# Solve solvable equations
436
441
neqs = nsrcs (graph)
437
442
for (ieq, iv) in enumerate (invview (var_eq_matching))
@@ -456,8 +461,9 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
456
461
# 0 ~ a * var + b
457
462
# var ~ -b/a
458
463
if ModelingToolkit. _iszero (a)
459
- push! (removed_eqs, ieq)
460
- push! (removed_vars, iv)
464
+ @warn " Tearing: $eq is a singular equation!"
465
+ # push!(removed_eqs, ieq)
466
+ # push!(removed_vars, iv)
461
467
else
462
468
rhs = - b / a
463
469
neweq = var ~ simplify ? Symbolics. simplify (rhs) : rhs
@@ -479,17 +485,20 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
479
485
end
480
486
# TODO : BLT sorting
481
487
neweqs = [diff_eqs; alge_eqs]
482
- eqsperm = [diffeq_idxs; algeeq_idxs]
488
+ inveqsperm = [diffeq_idxs; algeeq_idxs]
489
+ eqsperm = zeros (Int, nsrcs (graph))
490
+ for (i, v) in enumerate (inveqsperm)
491
+ eqsperm[v] = i
492
+ end
483
493
diff_vars_set = BitSet (diff_vars)
484
494
if length (diff_vars_set) != length (diff_vars)
485
495
error (" Tearing internal error: lowering DAE into semi-implicit ODE failed!" )
486
496
end
487
- invvarsperm = [diff_vars; setdiff (setdiff (1 : ndsts (graph), diff_vars_set), BitSet (solved_variables))]
497
+ invvarsperm = [diff_vars; setdiff! (setdiff (1 : ndsts (graph), diff_vars_set), BitSet (solved_variables))]
488
498
varsperm = zeros (Int, ndsts (graph))
489
499
for (i, v) in enumerate (invvarsperm)
490
500
varsperm[v] = i
491
501
end
492
- @show varsperm
493
502
494
503
if isempty (solved_equations)
495
504
deps = Vector{Int}[]
@@ -507,23 +516,31 @@ function tearing_reassemble(state::TearingState, var_eq_matching; simplify = fal
507
516
508
517
# Contract the vertices in the structure graph to make the structure match
509
518
# the new reality of the system we've just created.
510
- graph = contract_variables (graph, var_eq_matching, varsperm, solved_variables, eqsperm )
519
+ graph = contract_variables (graph, var_eq_matching, varsperm, eqsperm, length (solved_variables) )
511
520
512
521
# Update system
513
522
new_var_to_diff = complete (DiffGraph (length (invvarsperm)))
514
- idx = 0
515
523
for (v, d) in enumerate (var_to_diff)
516
524
v′ = varsperm[v]
517
525
(v′ > 0 && d != = nothing ) || continue
518
526
d′ = varsperm[d]
519
527
new_var_to_diff[v′] = d′ > 0 ? d′ : nothing
520
528
end
529
+ new_eq_to_diff = complete (DiffGraph (length (inveqsperm)))
530
+ for (v, d) in enumerate (eq_to_diff)
531
+ v′ = eqsperm[v]
532
+ (v′ > 0 && d != = nothing ) || continue
533
+ d′ = eqsperm[d]
534
+ new_eq_to_diff[v′] = d′ > 0 ? d′ : nothing
535
+ end
536
+
521
537
var_to_diff = new_var_to_diff
538
+ eq_to_diff = new_eq_to_diff
522
539
diff_to_var = invview (var_to_diff)
523
540
524
541
@set! state. structure. graph = graph
525
- # Note that `eq_to_diff` is not updated
526
542
@set! state. structure. var_to_diff = var_to_diff
543
+ @set! state. structure. eq_to_diff = eq_to_diff
527
544
@set! state. fullvars = fullvars = fullvars[invvarsperm]
528
545
529
546
sys = state. sys
0 commit comments