Skip to content

Commit 01d595a

Browse files
authored
Merge pull request #1839 from SciML/analysis_point
Add `find` and `replace` in `expand_connections`
2 parents 3b16c9c + a51ba6b commit 01d595a

File tree

1 file changed

+27
-9
lines changed

1 file changed

+27
-9
lines changed

src/systems/connectors.jl

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -198,25 +198,39 @@ function connection2set!(connectionsets, namespace, ss, isouter)
198198
end
199199
end
200200

201-
function generate_connection_set(sys::AbstractSystem)
201+
function generate_connection_set(sys::AbstractSystem, find = nothing, replace = nothing)
202202
connectionsets = ConnectionSet[]
203-
sys = generate_connection_set!(connectionsets, sys)
203+
sys = generate_connection_set!(connectionsets, sys, find, replace)
204204
sys, merge(connectionsets)
205205
end
206206

207-
function generate_connection_set!(connectionsets, sys::AbstractSystem, namespace = nothing)
207+
function generate_connection_set!(connectionsets, sys::AbstractSystem, find, replace,
208+
namespace = nothing)
208209
subsys = get_systems(sys)
209210

210211
isouter = generate_isouter(sys)
211212
eqs′ = get_eqs(sys)
212213
eqs = Equation[]
213214

214215
cts = [] # connections
216+
extra_states = []
215217
for eq in eqs′
216-
if eq.lhs isa Connection
217-
push!(cts, get_systems(eq.rhs))
218+
lhs = eq.lhs
219+
rhs = eq.rhs
220+
if find !== nothing && find(rhs, namespace)
221+
neweq, extra_state = replace(rhs, namespace)
222+
if extra_state isa AbstractArray
223+
append!(extra_states, unwrap.(extra_state))
224+
elseif extra_state !== nothing
225+
push!(extra_states, extra_state)
226+
end
227+
neweq isa AbstractArray ? append!(eqs, neweq) : push!(eqs, neweq)
218228
else
219-
push!(eqs, eq) # split connections and equations
229+
if lhs isa Number || lhs isa Symbolic
230+
push!(eqs, eq) # split connections and equations
231+
else
232+
push!(cts, get_systems(rhs))
233+
end
220234
end
221235
end
222236

@@ -235,7 +249,10 @@ function generate_connection_set!(connectionsets, sys::AbstractSystem, namespace
235249
end
236250

237251
# pre order traversal
238-
@set! sys.systems = map(s -> generate_connection_set!(connectionsets, s,
252+
if !isempty(extra_states)
253+
@set! sys.states = [get_states(sys); extra_states]
254+
end
255+
@set! sys.systems = map(s -> generate_connection_set!(connectionsets, s, find, replace,
239256
renamespace(namespace, nameof(s))),
240257
subsys)
241258
@set! sys.eqs = eqs
@@ -305,8 +322,9 @@ function generate_connection_equations_and_stream_connections(csets::AbstractVec
305322
eqs, stream_connections
306323
end
307324

308-
function expand_connections(sys::AbstractSystem; debug = false, tol = 1e-10)
309-
sys, csets = generate_connection_set(sys)
325+
function expand_connections(sys::AbstractSystem, find = nothing, replace = nothing;
326+
debug = false, tol = 1e-10)
327+
sys, csets = generate_connection_set(sys, find, replace)
310328
ceqs, instream_csets = generate_connection_equations_and_stream_connections(csets)
311329
_sys = expand_instream(instream_csets, sys; debug = debug, tol = tol)
312330
sys = flatten(sys, true)

0 commit comments

Comments
 (0)