@@ -177,15 +177,15 @@ end
177
177
function find_connection (connector_name, ogsys, names)
178
178
cs = get_connections (ogsys)
179
179
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
181
181
end
182
182
innersys = ogsys
183
183
for (i, n) in enumerate (names)
184
184
innersys = getproperty (innersys, n)
185
185
cs = get_connections (innersys)
186
186
cs === nothing || for c in cs
187
187
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
189
189
end
190
190
end
191
191
error (" $connector_name cannot be found in $(nameof (ogsys)) with levels $(names) " )
@@ -200,7 +200,9 @@ function flowvar(sys::AbstractSystem)
200
200
error (" There in no flow variable in $(nameof (sys)) " )
201
201
end
202
202
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 )
204
206
subsys = get_systems (sys)
205
207
isempty (subsys) && return sys
206
208
@@ -209,6 +211,8 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
209
211
n = nameof (s)
210
212
expand_instream (ogsys, s, [names; n], debug= debug)
211
213
end
214
+
215
+ sys = flatten (sys)
212
216
eqs′ = get_eqs (sys)
213
217
eqs = Equation[]
214
218
instream_eqs = Equation[]
@@ -225,79 +229,78 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
225
229
226
230
sub = Dict ()
227
231
seen = Set ()
228
- additional_eqs = Equation[]
232
+ # additional_eqs = Equation[]
229
233
for ex in instream_exprs
230
234
var = only (arguments (ex))
231
235
connector_name, streamvar_name = split_sys_var (var)
232
236
233
- outer_sc = []
234
- inner_sc = []
235
237
# find the connect
236
- parentsys , connect = find_connection (connector_name, ogsys, names)
238
+ connect_namespaces , connect = find_connection (connector_name, ogsys, names)
237
239
connectors = Iterators. flatten ((connect. inners, connect. outers))
238
240
# stream variable
239
241
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 = []
242
244
for s in connectors
243
245
push! (inner_sc, s)
244
246
end
247
+ outer_sc = []
245
248
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
253
251
end
254
252
255
- n_inners = length (outer_sc)
256
- n_outers = length (inner_sc)
253
+ n_outers = length (outer_sc)
254
+ n_inners = length (inner_sc)
257
255
outer_names = (nameof (s) for s in outer_sc)
258
256
inner_names = (nameof (s) for s in inner_sc)
259
257
if debug
258
+ @show connect_namespaces
260
259
println (" Expanding: $ex " )
261
260
isempty (inner_names) || println (" Inner connectors: $(collect (inner_names)) " )
262
261
isempty (outer_names) || println (" Outer connectors: $(collect (outer_names)) " )
263
262
end
264
263
264
+ cn = renamespace (connect_namespaces, connector_name)
265
265
# expand `instream`s
266
266
# https://specification.modelica.org/v3.4/Ch15.html
267
267
# Based on the above requirements, the following implementation is
268
268
# recommended:
269
269
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)) " )
271
271
sub[ex] = var
272
272
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)
275
276
other = idx == 1 ? 2 : 1
276
277
sub[ex] = states (inner_sc[other], sv)
277
278
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)) " )
281
282
if isinner
282
283
outerinstream = states (only (outer_sc), sv) # c_1.h_outflow
283
284
sub[ex] = outerinstream
284
285
end
285
286
if var in seen
286
- push! (additional_eqs, outerinstream ~ var)
287
+ # push!(additional_eqs, outerinstream ~ var)
287
288
push! (seen, var)
288
289
end
289
290
elseif n_inners == 0 && n_outers == 2
290
291
# we don't expand `instream` in this case.
292
+ #=
291
293
if var in seen
292
294
v1 = states(outer_sc[1], sv)
293
295
v2 = states(outer_sc[2], sv)
294
296
push!(additional_eqs, v1 ~ instream(v2))
295
297
push!(additional_eqs, v2 ~ instream(v1))
296
298
push!(seen, var)
297
299
end
300
+ =#
298
301
else
299
302
fv = flowvar (first (connectors))
300
- idx = findfirst (c-> nameof (c) === connector_name , inner_sc)
303
+ idx = findfirst (c-> nameof (c) === cn , inner_sc)
301
304
if idx != = nothing
302
305
si = sum (s-> max (states (s, fv), 0 ), outer_sc)
303
306
for j in 1 : n_inners; j == i && continue
@@ -309,19 +312,20 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
309
312
den = 0
310
313
for j in 1 : n_inners; j == i && continue
311
314
f = states (inner_sc[j], fv)
312
- tmp = positivemax (- f, si)
315
+ tmp = positivemax (- f, si; tol = tol )
313
316
den += tmp
314
317
num += tmp * states (inner_sc[j], sv)
315
318
end
316
319
for k in 1 : n_outers
317
320
f = states (outer_sc[k], fv)
318
- tmp = positivemax (f, si)
321
+ tmp = positivemax (f, si; tol = tol )
319
322
den += tmp
320
323
num += tmp * instream (states (outer_sc[k], sv))
321
324
end
322
325
sub[ex] = num / den
323
326
end
324
327
328
+ #=
325
329
if var in seen
326
330
for q in 1:n_outers
327
331
sq += sum(s->max(-states(s, fv), 0), inner_sc)
@@ -334,20 +338,21 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
334
338
den = 0
335
339
for j in 1:n_inners
336
340
f = states(inner_sc[j], fv)
337
- tmp = positivemax (- f, sq)
341
+ tmp = positivemax(-f, sq; tol=tol )
338
342
den += tmp
339
343
num += tmp * states(inner_sc[j], sv)
340
344
end
341
345
for k in 1:n_outers; k == q && continue
342
346
f = states(outer_sc[k], fv)
343
- tmp = positivemax (f, sq)
347
+ tmp = positivemax(f, sq; tol=tol )
344
348
den += tmp
345
349
num += tmp * instream(states(outer_sc[k], sv))
346
350
end
347
351
push!(additional_eqs, states(outer_sc[q], sv) ~ num / den)
348
352
end
349
353
push!(seen, var)
350
354
end
355
+ =#
351
356
end
352
357
end
353
358
instream_eqs = map (Base. Fix2 (substitute, sub), instream_eqs)
@@ -364,7 +369,7 @@ function expand_instream(ogsys, sys::AbstractSystem=ogsys, names=[]; debug=false
364
369
end
365
370
end
366
371
@set! sys. eqs = [eqs; instream_eqs; additional_eqs]
367
- return flatten ( sys)
372
+ return sys
368
373
end
369
374
370
375
function expand_connections (sys:: AbstractSystem ; debug= false )
0 commit comments