Skip to content

Commit e14e633

Browse files
Merge pull request #363 from matthew-kapp/hydraulic-macros
Hydraulic library updated to use macros
2 parents 8f9ab6a + 49a0262 commit e14e633

File tree

2 files changed

+102
-102
lines changed

2 files changed

+102
-102
lines changed

src/Hydraulic/IsothermalCompressible/components.jl

+87-78
Original file line numberDiff line numberDiff line change
@@ -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)
2428
end
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)
5357
end
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)
268272
end
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)
358362
end
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)
390396
end
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)
426430
end
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
431435
Volume 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
464468
See 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)])
507516
end
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
512521
Volume 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

src/Hydraulic/IsothermalCompressible/sources.jl

+15-24
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,16 @@ Hydraulic mass flow input source
88
- `port`: hydraulic port
99
- `dm`: real input
1010
"""
11-
@component function MassFlow(; name)
12-
pars = []
11+
@mtkmodel MassFlow begin
1312

14-
systems = @named begin
13+
@components begin
1514
port = HydraulicPort()
1615
dm = RealInput()
1716
end
1817

19-
vars = []
20-
eqs = [
18+
@equations begin
2119
port.dm ~ -dm.u
22-
]
23-
24-
ODESystem(eqs, t, vars, pars; name, systems)
20+
end
2521
end
2622

2723
"""
@@ -35,22 +31,20 @@ Fixed pressure source
3531
# Connectors:
3632
- `port`: hydraulic port
3733
"""
38-
@component function FixedPressure(; p, name)
39-
pars = @parameters begin
40-
p = p
41-
end
34+
@mtkmodel FixedPressure begin
4235

43-
vars = []
36+
@parameters begin
37+
p
38+
end
4439

45-
systems = @named begin
40+
@components begin
4641
port = HydraulicPort()
4742
end
4843

49-
eqs = [
44+
@equations begin
5045
port.p ~ p
51-
]
46+
end
5247

53-
ODESystem(eqs, t, vars, pars; name, systems)
5448
end
5549
@deprecate Source FixedPressure
5650

@@ -63,19 +57,16 @@ input pressure source
6357
- `port`: hydraulic port
6458
- `p`: real input
6559
"""
66-
@component function Pressure(; name)
67-
pars = []
68-
vars = []
60+
@mtkmodel Pressure begin
6961

70-
systems = @named begin
62+
@components begin
7163
port = HydraulicPort()
7264
p = RealInput()
7365
end
7466

75-
eqs = [
67+
@equations begin
7668
port.p ~ p.u
77-
]
69+
end
7870

79-
ODESystem(eqs, t, vars, pars; name, systems)
8071
end
8172
@deprecate InputSource Pressure

0 commit comments

Comments
 (0)