240
240
function tearing_reassemble (state:: TearingState , var_eq_matching,
241
241
full_var_eq_matching = nothing ; simplify = false , mm = nothing , cse_hack = true , array_hack = true )
242
242
@unpack fullvars, sys, structure = state
243
- @unpack solvable_graph, var_to_diff, eq_to_diff, graph = structure
243
+ @unpack solvable_graph, var_to_diff, eq_to_diff, graph, lowest_shift = structure
244
244
extra_vars = Int[]
245
245
if full_var_eq_matching != = nothing
246
246
for v in 𝑑vertices (state. structure. graph)
@@ -279,6 +279,7 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
279
279
iv = D = nothing
280
280
end
281
281
diff_to_var = invview (var_to_diff)
282
+
282
283
dummy_sub = Dict ()
283
284
for var in 1 : length (fullvars)
284
285
dv = var_to_diff[var]
@@ -310,7 +311,10 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
310
311
diff_to_var[dv] = nothing
311
312
end
312
313
end
314
+ @show neweqs
313
315
316
+ println (" Post state selection." )
317
+
314
318
# `SelectedState` information is no longer needed past here. State selection
315
319
# is done. All non-differentiated variables are algebraic variables, and all
316
320
# variables that appear differentiated are differential variables.
@@ -331,10 +335,28 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
331
335
order += 1
332
336
dv = dv′
333
337
end
338
+ println (" Order" )
339
+ @show fullvars[dv]
340
+ is_only_discrete (state. structure) && begin
341
+ var = fullvars[dv]
342
+ key = operation (var) isa Shift ? only (arguments (var)) : var
343
+ order = - get (lowest_shift, key, 0 ) - order
344
+ end
334
345
order, dv
335
346
end
336
347
end
337
348
349
+ lower_name = is_only_discrete (state. structure) ? lower_varname_withshift : lower_varname_with_unit
350
+ # is_only_discrete(state.structure) && for v in 1:length(fullvars)
351
+ # var = fullvars[v]
352
+ # op = operation(var)
353
+ # if op isa Shift
354
+ # x = only(arguments(var))
355
+ # lowest_shift_idxs[v]
356
+ # op.steps == lowest_shift[x] && (fullvars[v] = lower_varname_withshift(var, iv, -op.steps))
357
+ # end
358
+ # end
359
+
338
360
# retear = BitSet()
339
361
# There are three cases where we want to generate new variables to convert
340
362
# the system into first order (semi-implicit) ODEs.
@@ -384,9 +406,28 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
384
406
eq_var_matching = invview (var_eq_matching)
385
407
linear_eqs = mm === nothing ? Dict {Int, Int} () :
386
408
Dict (reverse (en) for en in enumerate (mm. nzrows))
409
+
387
410
for v in 1 : length (var_to_diff)
388
- dv = var_to_diff[v]
411
+ println ()
412
+ @show fullvars
413
+ @show diff_to_var
414
+ is_highest_discrete = begin
415
+ var = fullvars[v]
416
+ op = operation (var)
417
+ if (! is_only_discrete (state. structure) || op isa Shift)
418
+ false
419
+ elseif ! haskey (lowest_shift, var)
420
+ false
421
+ else
422
+ low = lowest_shift[var]
423
+ idx = findfirst (x -> isequal (x, Shift (iv, low)(var)), fullvars)
424
+ true
425
+ end
426
+ end
427
+ dv = is_highest_discrete ? idx : var_to_diff[v]
428
+ @show (v, fullvars[v], dv)
389
429
dv isa Int || continue
430
+
390
431
solved = var_eq_matching[dv] isa Int
391
432
solved && continue
392
433
# check if there's `D(x) = x_t` already
@@ -404,17 +445,19 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
404
445
diff_to_var[v_t] === nothing )
405
446
@assert dv in rvs
406
447
dummy_eq = eq
448
+ @show " FOUND DUMMY EQ"
407
449
@goto FOUND_DUMMY_EQ
408
450
end
409
451
end
410
452
dx = fullvars[dv]
411
453
# add `x_t`
412
- order, lv = var_order (dv)
413
- x_t = lower_varname_withshift (fullvars[lv], iv, order)
454
+ @show order, lv = var_order (dv)
455
+ x_t = lower_name (fullvars[lv], iv, order)
414
456
push! (fullvars, simplify_shifts (x_t))
415
457
v_t = length (fullvars)
416
458
v_t_idx = add_vertex! (var_to_diff)
417
459
add_vertex! (graph, DST)
460
+ @show x_t, dx
418
461
# TODO : do we care about solvable_graph? We don't use them after
419
462
# `dummy_derivative_graph`.
420
463
add_vertex! (solvable_graph, DST)
@@ -433,10 +476,16 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
433
476
add_edge! (solvable_graph, dummy_eq, dv)
434
477
@assert nsrcs (graph) == nsrcs (solvable_graph) == dummy_eq
435
478
@label FOUND_DUMMY_EQ
479
+ @show is_highest_discrete
480
+ @show diff_to_var
481
+ @show v_t, dv
482
+ # If var = x with no shift, then
483
+ is_highest_discrete && (lowest_shift[x_t] = lowest_shift[fullvars[v]])
436
484
var_to_diff[v_t] = var_to_diff[dv]
437
485
var_eq_matching[dv] = unassigned
438
486
eq_var_matching[dummy_eq] = dv
439
487
end
488
+ @show neweqs
440
489
441
490
# Will reorder equations and unknowns to be:
442
491
# [diffeqs; ...]
@@ -537,6 +586,7 @@ function tearing_reassemble(state::TearingState, var_eq_matching,
537
586
538
587
deps = Vector{Int}[i == 1 ? Int[] : collect (1 : (i - 1 ))
539
588
for i in 1 : length (solved_equations)]
589
+
540
590
# Contract the vertices in the structure graph to make the structure match
541
591
# the new reality of the system we've just created.
542
592
graph = contract_variables (graph, var_eq_matching, varsperm, eqsperm,
0 commit comments