@@ -4,7 +4,7 @@ using DataStructures
4
4
using SymbolicUtils: istree, operation, arguments, Symbolic
5
5
using .. ModelingToolkit
6
6
import .. ModelingToolkit: isdiffeq, var_from_nested_derivative, vars!, flatten,
7
- value, InvalidSystemException, isdifferential
7
+ value, InvalidSystemException, isdifferential, _iszero, isparameter
8
8
using .. BipartiteGraphs
9
9
using UnPack
10
10
using Setfield
39
39
40
40
export SystemStructure, initialize_system_structure, find_linear_equations
41
41
export isdiffvar, isdervar, isalgvar, isdiffeq, isalgeq
42
+ export dervars_range, diffvars_range, algvars_range
42
43
43
44
@enum VariableType:: Int8 DIFFERENTIAL_VARIABLE ALGEBRAIC_VARIABLE DERIVATIVE_VARIABLE
44
45
@@ -68,8 +69,10 @@ isalgeq(s::SystemStructure, eq::Integer) = s.algeqs[eq]
68
69
isdiffeq (s:: SystemStructure , eq:: Integer ) = ! isalgeq (s, eq)
69
70
70
71
function initialize_system_structure (sys)
72
+ sys = flatten (sys)
73
+
71
74
iv = independent_variable (sys)
72
- eqs = equations (sys)
75
+ eqs = copy ( equations (sys) )
73
76
neqs = length (eqs)
74
77
algeqs = trues (neqs)
75
78
dervaridxs = Int[]
@@ -81,13 +84,17 @@ function initialize_system_structure(sys)
81
84
for (i, eq) in enumerate (eqs)
82
85
vars = OrderedSet ()
83
86
vars! (vars, eq)
84
- push! (symbolic_incidence, copy (vars))
85
87
isalgeq = true
88
+ statevars = []
86
89
for var in vars
87
- varidx = get (var2idx, var, 0 )
88
- if varidx == 0 # new var
89
- var_counter += 1
90
+ isequal (var, iv) && continue
91
+ if isparameter (var) || (istree (var) && isparameter (operation (var)))
92
+ continue
93
+ end
94
+ push! (statevars, var)
95
+ varidx = get! (var2idx, var) do
90
96
push! (fullvars, var)
97
+ var_counter += 1
91
98
end
92
99
93
100
if isdifferential (var)
@@ -99,13 +106,21 @@ function initialize_system_structure(sys)
99
106
push! (dervaridxs, varidx)
100
107
end
101
108
end
109
+ push! (symbolic_incidence, copy (statevars))
110
+ empty! (statevars)
102
111
algeqs[i] = isalgeq
112
+ if isalgeq && ! _iszero (eq. lhs)
113
+ eqs[i] = 0 ~ eq. rhs - eq. lhs
114
+ end
103
115
end
104
116
117
+ nvars = length (fullvars)
105
118
diffvars = []
106
- varassoc = zeros (Int, length (fullvars))
107
- inv_varassoc = zeros (Int, length (fullvars))
119
+ vartype = fill (DIFFERENTIAL_VARIABLE, nvars)
120
+ varassoc = zeros (Int, nvars)
121
+ inv_varassoc = zeros (Int, nvars)
108
122
for dervaridx in dervaridxs
123
+ vartype[dervaridx] = DERIVATIVE_VARIABLE
109
124
dervar = fullvars[dervaridx]
110
125
diffvar = arguments (dervar)[1 ]
111
126
diffvaridx = get (var2idx, diffvar, 0 )
@@ -121,20 +136,19 @@ function initialize_system_structure(sys)
121
136
# it could be that a variable appeared in the states, but never appeared
122
137
# in the equations.
123
138
algvaridx = get (var2idx, algvar, 0 )
124
- if algvaridx != 0
125
- varassoc[algvaridx] = - 1
126
- end
139
+ vartype[algvaridx] = ALGEBRAIC_VARIABLE
127
140
end
128
141
129
- neqs, nvars = length (eqs), length (fullvars)
130
142
graph = BipartiteGraph (neqs, nvars)
131
143
for (ie, vars) in enumerate (symbolic_incidence), v in vars
132
144
jv = var2idx[v]
133
145
add_edge! (graph, ie, jv)
134
146
end
135
147
136
- SystemStructure (
148
+ @set! sys. eqs = eqs
149
+ @set! sys. structure = SystemStructure (
137
150
fullvars = fullvars,
151
+ vartype = vartype,
138
152
varassoc = varassoc,
139
153
inv_varassoc = inv_varassoc,
140
154
algeqs = algeqs,
@@ -145,6 +159,7 @@ function initialize_system_structure(sys)
145
159
scc = Vector{Int}[],
146
160
partitions = NTuple{4 , Vector{Int}}[],
147
161
)
162
+ return sys
148
163
end
149
164
150
165
function find_linear_equations (sys)
@@ -194,41 +209,15 @@ function find_linear_equations(sys)
194
209
is_linear_equations[i] = false
195
210
end
196
211
end
197
- sys, dxvar_offset, fullvars, varassoc, algeqs, graph = init_graph (flatten (sys))
198
-
199
- solvable_graph = BipartiteGraph (nsrcs (graph), ndsts (graph))
200
-
201
- @set sys. structure = SystemStructure (
202
- dxvar_offset,
203
- fullvars,
204
- varassoc,
205
- algeqs,
206
- graph,
207
- solvable_graph,
208
- Int[],
209
- Int[],
210
- Vector{Int}[],
211
- NTuple{4 , Vector{Int}}[]
212
- )
212
+
213
+ return is_linear_equations, eadj, cadj
213
214
end
214
215
215
216
function Base. show (io:: IO , s:: SystemStructure )
216
- @unpack fullvars, dxvar_offset, solvable_graph, graph = s
217
- algvar_offset = 2 dxvar_offset
218
- print (io, " xvars: " )
219
- print (io, fullvars[1 : dxvar_offset])
220
- print (io, " \n dxvars: " )
221
- print (io, fullvars[dxvar_offset+ 1 : algvar_offset])
222
- print (io, " \n algvars: " )
223
- print (io, fullvars[algvar_offset+ 1 : end ], ' \n ' )
224
-
217
+ @unpack graph = s
225
218
S = incidence_matrix (graph, Num (Sym {Real} (:× )))
226
219
print (io, " Incidence matrix:" )
227
220
show (io, S)
228
221
end
229
222
230
- function init_graph (sys)
231
- return is_linear_equations, eadj, cadj
232
- end
233
-
234
223
end # module
0 commit comments