Skip to content

Commit 6b6800b

Browse files
committed
WIP
1 parent fdb8535 commit 6b6800b

File tree

1 file changed

+36
-31
lines changed

1 file changed

+36
-31
lines changed

src/systems/connectors.jl

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,15 @@ end
177177
function find_connection(connector_name, ogsys, names)
178178
cs = get_connections(ogsys)
179179
cs === nothing || for c in cs
180-
renamespace(names, connector_name) in c && return ogsys, c
180+
renamespace(names, connector_name) in c && return names, c
181181
end
182182
innersys = ogsys
183183
for (i, n) in enumerate(names)
184184
innersys = getproperty(innersys, n)
185185
cs = get_connections(innersys)
186186
cs === nothing || for c in cs
187187
nn = @view names[i+1:end]
188-
renamespace(nn, connector_name) in c && return innersys, c
188+
renamespace(nn, connector_name) in c && return nn, c
189189
end
190190
end
191191
error("$connector_name cannot be found in $(nameof(ogsys)) with levels $(names)")
@@ -200,7 +200,9 @@ function flowvar(sys::AbstractSystem)
200200
error("There in no flow variable in $(nameof(sys))")
201201
end
202202

203-
function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false)
203+
positivemax(m, ::Any; tol=nothing)= max(m, something(tol, 1e-8))
204+
205+
function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false, tol=nothing)
204206
subsys = get_systems(sys)
205207
isempty(subsys) && return sys
206208

@@ -209,6 +211,8 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
209211
n = nameof(s)
210212
expand_instream(ogsys, s, [names; n], debug=debug)
211213
end
214+
215+
sys = flatten(sys)
212216
eqs′ = get_eqs(sys)
213217
eqs = Equation[]
214218
instream_eqs = Equation[]
@@ -225,79 +229,78 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
225229

226230
sub = Dict()
227231
seen = Set()
228-
additional_eqs = Equation[]
232+
#additional_eqs = Equation[]
229233
for ex in instream_exprs
230234
var = only(arguments(ex))
231235
connector_name, streamvar_name = split_sys_var(var)
232236

233-
outer_sc = []
234-
inner_sc = []
235237
# find the connect
236-
parentsys, connect = find_connection(connector_name, ogsys, names)
238+
connect_namespaces, connect = find_connection(connector_name, ogsys, names)
237239
connectors = Iterators.flatten((connect.inners, connect.outers))
238240
# stream variable
239241
sv = getproperty(first(connectors), streamvar_name; namespace=false)
240-
if nameof(parentsys) != nameof(sys)
241-
# everything is a inner connector w.r.t. `sys`
242+
if connect_namespaces !== names
243+
inner_sc = []
242244
for s in connectors
243245
push!(inner_sc, s)
244246
end
247+
outer_sc = []
245248
else
246-
for s in connectors
247-
if connector_name == split_var(nameof(s))[1]
248-
push!(inner_sc, s)
249-
else
250-
push!(outer_sc, s)
251-
end
252-
end
249+
inner_sc = connect.inners
250+
outer_sc = connect.outers
253251
end
254252

255-
n_inners = length(outer_sc)
256-
n_outers = length(inner_sc)
253+
n_outers = length(outer_sc)
254+
n_inners = length(inner_sc)
257255
outer_names = (nameof(s) for s in outer_sc)
258256
inner_names = (nameof(s) for s in inner_sc)
259257
if debug
258+
@show connect_namespaces
260259
println("Expanding: $ex")
261260
isempty(inner_names) || println("Inner connectors: $(collect(inner_names))")
262261
isempty(outer_names) || println("Outer connectors: $(collect(outer_names))")
263262
end
264263

264+
cn = renamespace(connect_namespaces, connector_name)
265265
# expand `instream`s
266266
# https://specification.modelica.org/v3.4/Ch15.html
267267
# Based on the above requirements, the following implementation is
268268
# recommended:
269269
if n_inners == 1 && n_outers == 0
270-
connector_name === only(inner_names) || error("$stream_name is not in any stream connector of $(nameof(ogsys))")
270+
cn === only(inner_names) || error("$var is not in any stream connector of $(nameof(ogsys))")
271271
sub[ex] = var
272272
elseif n_inners == 2 && n_outers == 0
273-
connector_name in inner_names || error("$stream_name is not in any stream connector of $(nameof(ogsys))")
274-
idx = findfirst(c->nameof(c) === connector_name, inner_sc)
273+
@info names cn collect(inner_names) length(inner_sc)
274+
cn in inner_names || error("$var is not in any stream connector of $(nameof(ogsys))")
275+
idx = findfirst(c->nameof(c) === cn, inner_sc)
275276
other = idx == 1 ? 2 : 1
276277
sub[ex] = states(inner_sc[other], sv)
277278
elseif n_inners == 1 && n_outers == 1
278-
isinner = connector_name === only(inner_names)
279-
isouter = connector_name === only(outer_names)
280-
(isinner || isouter) || error("$stream_name is not in any stream connector of $(nameof(ogsys))")
279+
isinner = cn === only(inner_names)
280+
isouter = cn === only(outer_names)
281+
(isinner || isouter) || error("$var is not in any stream connector of $(nameof(ogsys))")
281282
if isinner
282283
outerinstream = states(only(outer_sc), sv) # c_1.h_outflow
283284
sub[ex] = outerinstream
284285
end
285286
if var in seen
286-
push!(additional_eqs, outerinstream ~ var)
287+
#push!(additional_eqs, outerinstream ~ var)
287288
push!(seen, var)
288289
end
289290
elseif n_inners == 0 && n_outers == 2
290291
# we don't expand `instream` in this case.
292+
#=
291293
if var in seen
292294
v1 = states(outer_sc[1], sv)
293295
v2 = states(outer_sc[2], sv)
294296
push!(additional_eqs, v1 ~ instream(v2))
295297
push!(additional_eqs, v2 ~ instream(v1))
296298
push!(seen, var)
297299
end
300+
=#
298301
else
299302
fv = flowvar(first(connectors))
300-
idx = findfirst(c->nameof(c) === connector_name, inner_sc)
303+
idx = findfirst(c->nameof(c) === cn, inner_sc)
301304
if idx !== nothing
302305
si = sum(s->max(states(s, fv), 0), outer_sc)
303306
for j in 1:n_inners; j == i && continue
@@ -309,19 +312,20 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
309312
den = 0
310313
for j in 1:n_inners; j == i && continue
311314
f = states(inner_sc[j], fv)
312-
tmp = positivemax(-f, si)
315+
tmp = positivemax(-f, si; tol=tol)
313316
den += tmp
314317
num += tmp * states(inner_sc[j], sv)
315318
end
316319
for k in 1:n_outers
317320
f = states(outer_sc[k], fv)
318-
tmp = positivemax(f, si)
321+
tmp = positivemax(f, si; tol=tol)
319322
den += tmp
320323
num += tmp * instream(states(outer_sc[k], sv))
321324
end
322325
sub[ex] = num / den
323326
end
324327

328+
#=
325329
if var in seen
326330
for q in 1:n_outers
327331
sq += sum(s->max(-states(s, fv), 0), inner_sc)
@@ -334,20 +338,21 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
334338
den = 0
335339
for j in 1:n_inners
336340
f = states(inner_sc[j], fv)
337-
tmp = positivemax(-f, sq)
341+
tmp = positivemax(-f, sq; tol=tol)
338342
den += tmp
339343
num += tmp * states(inner_sc[j], sv)
340344
end
341345
for k in 1:n_outers; k == q && continue
342346
f = states(outer_sc[k], fv)
343-
tmp = positivemax(f, sq)
347+
tmp = positivemax(f, sq; tol=tol)
344348
den += tmp
345349
num += tmp * instream(states(outer_sc[k], sv))
346350
end
347351
push!(additional_eqs, states(outer_sc[q], sv) ~ num / den)
348352
end
349353
push!(seen, var)
350354
end
355+
=#
351356
end
352357
end
353358
instream_eqs = map(Base.Fix2(substitute, sub), instream_eqs)
@@ -364,7 +369,7 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
364369
end
365370
end
366371
@set! sys.eqs = [eqs; instream_eqs; additional_eqs]
367-
return flatten(sys)
372+
return sys
368373
end
369374

370375
function expand_connections(sys::AbstractSystem; debug=false)

0 commit comments

Comments
 (0)