@@ -10,17 +10,21 @@ Caps a hydraulic port to prevent mass flow in or out.
1010# Connectors:
1111- `port`: hydraulic port
1212"""
13- @component function Cap (; name)
14- vars = @variables p (t), [guess = 0 ]
13+ @mtkmodel Cap begin
1514
16- systems = @named begin
15+ @variables begin
16+ p (t), [guess = 0 ]
17+ end
18+
19+ @components begin
1720 port = HydraulicPort ()
1821 end
1922
20- eqs = [port. p ~ p
21- port. dm ~ 0 ]
23+ @equations begin
24+ port. p ~ p
25+ port. dm ~ 0
26+ end
2227
23- ODESystem (eqs, t, vars, []; name, systems)
2428end
2529
2630"""
@@ -34,22 +38,22 @@ Provides an "open" boundary condition for a hydraulic port such that mass flow `
3438# Connectors:
3539- `port`: hydraulic port
3640"""
37- @component function Open (; name)
38- pars = []
41+ @mtkmodel Open begin
3942
40- vars = @variables begin
43+ @variables begin
4144 p (t), [guess = 0 ]
4245 dm (t), [guess = 0 ]
4346 end
4447
45- systems = @named begin
48+ @components begin
4649 port = HydraulicPort ()
4750 end
4851
49- eqs = [port. p ~ p
50- port. dm ~ dm]
52+ @equations begin
53+ port. p ~ p
54+ port. dm ~ dm
55+ end
5156
52- ODESystem (eqs, t, vars, pars; name, systems)
5357end
5458
5559"""
@@ -238,33 +242,33 @@ Reduces the flow from `port_a` to `port_b` by `n`. Useful for modeling parallel
238242- `port_a`: full flow hydraulic port
239243- `port_b`: part flow hydraulic port
240244"""
241- @component function FlowDivider (; n, name)
245+ @mtkmodel FlowDivider begin
242246
243247 # TODO : assert n >= 1
244248
245- pars = @parameters begin
249+ @parameters begin
246250 n = n
247251 end
248252
249- vars = @variables begin
253+ @variables begin
250254 dm_a (t), [guess = 0 ]
251255 dm_b (t), [guess = 0 ]
252256 end
253257
254- systems = @named begin
258+ @components begin
255259 port_a = HydraulicPort ()
256260 port_b = HydraulicPort ()
257261 open = Open ()
258262 end
259263
260- eqs = [connect (port_a, port_b, open. port)
261- dm_a ~ port_a. dm
262- dm_b ~ dm_a / n
263- open. dm ~ dm_a - dm_b # extra flow dumps into an open port
264- # port_b.dm ~ dm_b # divided flow goes to port_b
265- ]
264+ @equations begin
265+ connect (port_a, port_b, open. port)
266+ dm_a ~ port_a. dm
267+ dm_b ~ dm_a / n
268+ open. dm ~ dm_a - dm_b # extra flow dumps into an open port
269+ # port_b.dm ~ dm_b # divided flow goes to port_b
270+ end
266271
267- ODESystem (eqs, t, vars, pars; name, systems)
268272end
269273
270274@component function ValveBase (
@@ -357,36 +361,38 @@ Valve with `area` input and discharge coefficient `Cd` defined by https://en.wik
357361 ODESystem (eqs, t, vars, pars; name, systems)
358362end
359363
360- @component function VolumeBase (; area, dead_volume = 0 , Χ1 = 1 , Χ2 = 1 ,
361- name)
362- pars = @parameters begin
363- area = area
364- dead_volume = dead_volume
364+ @mtkmodel VolumeBase begin
365+
366+ @structural_parameters begin
367+ Χ1 = 1
368+ Χ2 = 1
365369 end
366370
367- systems = @named begin
371+ @parameters begin
372+ area
373+ dead_volume
374+ end
375+
376+ @components begin
368377 port = HydraulicPort ()
369378 end
370379
371- vars = @variables begin
380+ @variables begin
372381 x (t)
373382 dx (t), [guess = 0 ]
374383 rho (t), [guess = liquid_density (port)]
375384 drho (t), [guess = 0 ]
376385 vol (t)
377386 end
378387
379- # let
380- dm = port. dm
381- p = port. p
382-
383- eqs = [vol ~ dead_volume + area * x
384- D (x) ~ dx
385- D (rho) ~ drho
386- rho ~ full_density (port, p)
387- dm ~ drho * vol * Χ1 + rho * area * dx * Χ2]
388+ @equations begin
389+ vol ~ dead_volume + area * x
390+ D (x) ~ dx
391+ D (rho) ~ drho
392+ rho ~ full_density (port, port. p)
393+ port. dm ~ drho * vol * Χ1 + rho * area * dx * Χ2
394+ end
388395
389- ODESystem (eqs, t, vars, pars; name, systems)
390396end
391397
392398"""
@@ -400,33 +406,31 @@ Fixed fluid volume.
400406# Connectors:
401407- `port`: hydraulic port
402408"""
403- @component function FixedVolume (; vol, name)
404- pars = @parameters begin
405- vol = vol
409+ @mtkmodel FixedVolume begin
410+
411+ @parameters begin
412+ vol
406413 end
407414
408- systems = @named begin
415+ @components begin
409416 port = HydraulicPort (;)
410417 end
411418
412- vars = @variables begin
419+ @variables begin
413420 rho (t), [guess = liquid_density (port)]
414421 drho (t), [guess = 0 ]
415422 end
416423
417- # let
418- dm = port. dm
419- p = port. p
420-
421- eqs = [D (rho) ~ drho
422- rho ~ full_density (port, p)
423- dm ~ drho * vol]
424+ @equations begin
425+ D (rho) ~ drho
426+ rho ~ full_density (port, port. p)
427+ port. dm ~ drho * vol
428+ end
424429
425- ODESystem (eqs, t, vars, pars; name, systems)
426430end
427431
428432"""
429- Volume(; x, dx=0, p, drho=0, dm=0, area, direction = + 1, name)
433+ Volume(; x, dx=0, p, drho=0, dm=0, area, direction = 1, name)
430434
431435Volume with moving wall with `flange` connector for converting hydraulic energy to 1D mechanical. The `direction` argument aligns the mechanical port with the hydraulic port, useful when connecting two dynamic volumes together in oppsing directions to create an actuator.
432436
@@ -463,16 +467,17 @@ dm ────► │ │ area
463467
464468See also [`FixedVolume`](@ref), [`DynamicVolume`](@ref)
465469"""
466- @component function Volume (;
470+ @mtkmodel Volume begin
467471
468- # parameters
469- area,
470- direction = + 1 , name)
471- pars = @parameters begin
472- area = area
472+ @structural_parameters begin
473+ direction = 1
473474 end
474475
475- vars = @variables begin
476+ @parameters begin
477+ area
478+ end
479+
480+ @variables begin
476481 x (t)
477482 dx (t)
478483 p (t)
@@ -482,32 +487,36 @@ See also [`FixedVolume`](@ref), [`DynamicVolume`](@ref)
482487 dm (t)
483488 end
484489
485- systems = @named begin
490+ @components begin
486491 port = HydraulicPort ()
487492 flange = MechanicalPort ()
488493 end
489494
490- eqs = [
491- # connectors
492- port. p ~ p
493- port. dm ~ dm
494- flange. v * direction ~ dx
495- flange. f * direction ~ - f
495+ @equations begin
496+ # connectors
497+ port. p ~ p
498+ port. dm ~ dm
499+ flange. v * direction ~ dx
500+ flange. f * direction ~ - f
496501
497- # differentials
498- D (x) ~ dx
499- D (rho) ~ drho
502+ # differentials
503+ D (x) ~ dx
504+ D (rho) ~ drho
500505
501- # physics
502- rho ~ liquid_density (port, p)
503- f ~ p * area
504- dm ~ drho * x * area + rho * dx * area]
506+ # physics
507+ rho ~ liquid_density (port, p)
508+ f ~ p * area
509+ dm ~ drho * x * area + rho * dx * area
510+ end
511+
512+ @defaults begin
513+ rho => liquid_density (port)
514+ end
505515
506- ODESystem (eqs, t, vars, pars; name, systems, defaults = [rho => liquid_density (port)])
507516end
508517
509518"""
510- DynamicVolume(N, add_inertia=true; p_int, area, x_int = 0, x_max, x_min = 0, x_damp = x_min, direction = +1, perimeter = 2 * sqrt(area * pi), shape_factor = 64, head_factor = 1, Cd = 1e2, Cd_reverse = Cd, name)
519+ DynamicVolume(N, add_inertia=true, reversible=false; area, x_int = 0, x_max, x_min = 0, x_damp = x_min, direction = +1, perimeter = 2 * sqrt(area * pi), shape_factor = 64, head_factor = 1, Cd = 1e2, Cd_reverse = Cd, name)
511520
512521Volume with moving wall with `flange` connector for converting hydraulic energy to 1D mechanical. The `direction` argument aligns the mechanical port with the hydraulic port, useful when connecting two dynamic volumes together in oppsing directions to create an actuator.
513522
0 commit comments