Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
165 changes: 87 additions & 78 deletions src/Hydraulic/IsothermalCompressible/components.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,21 @@ Caps a hydraulic port to prevent mass flow in or out.
# Connectors:
- `port`: hydraulic port
"""
@component function Cap(; name)
vars = @variables p(t), [guess = 0]
@mtkmodel Cap begin

systems = @named begin
@variables begin
p(t), [guess = 0]
end

@components begin
port = HydraulicPort()
end

eqs = [port.p ~ p
port.dm ~ 0]
@equations begin
port.p ~ p
port.dm ~ 0
end

ODESystem(eqs, t, vars, []; name, systems)
end

"""
Expand All @@ -34,22 +38,22 @@ Provides an "open" boundary condition for a hydraulic port such that mass flow `
# Connectors:
- `port`: hydraulic port
"""
@component function Open(; name)
pars = []
@mtkmodel Open begin

vars = @variables begin
@variables begin
p(t), [guess = 0]
dm(t), [guess = 0]
end

systems = @named begin
@components begin
port = HydraulicPort()
end

eqs = [port.p ~ p
port.dm ~ dm]
@equations begin
port.p ~ p
port.dm ~ dm
end

ODESystem(eqs, t, vars, pars; name, systems)
end

"""
Expand Down Expand Up @@ -238,33 +242,33 @@ Reduces the flow from `port_a` to `port_b` by `n`. Useful for modeling parallel
- `port_a`: full flow hydraulic port
- `port_b`: part flow hydraulic port
"""
@component function FlowDivider(; n, name)
@mtkmodel FlowDivider begin

#TODO: assert n >= 1

pars = @parameters begin
@parameters begin
n = n
end

vars = @variables begin
@variables begin
dm_a(t), [guess = 0]
dm_b(t), [guess = 0]
end

systems = @named begin
@components begin
port_a = HydraulicPort()
port_b = HydraulicPort()
open = Open()
end

eqs = [connect(port_a, port_b, open.port)
dm_a ~ port_a.dm
dm_b ~ dm_a / n
open.dm ~ dm_a - dm_b # extra flow dumps into an open port
# port_b.dm ~ dm_b # divided flow goes to port_b
]
@equations begin
connect(port_a, port_b, open.port)
dm_a ~ port_a.dm
dm_b ~ dm_a / n
open.dm ~ dm_a - dm_b # extra flow dumps into an open port
# port_b.dm ~ dm_b # divided flow goes to port_b
end

ODESystem(eqs, t, vars, pars; name, systems)
end

@component function ValveBase(
Expand Down Expand Up @@ -357,36 +361,38 @@ Valve with `area` input and discharge coefficient `Cd` defined by https://en.wik
ODESystem(eqs, t, vars, pars; name, systems)
end

@component function VolumeBase(; area, dead_volume = 0, Χ1 = 1, Χ2 = 1,
name)
pars = @parameters begin
area = area
dead_volume = dead_volume
@mtkmodel VolumeBase begin

@structural_parameters begin
Χ1 = 1
Χ2 = 1
end

systems = @named begin
@parameters begin
area
dead_volume
end

@components begin
port = HydraulicPort()
end

vars = @variables begin
@variables begin
x(t)
dx(t), [guess = 0]
rho(t), [guess = liquid_density(port)]
drho(t), [guess = 0]
vol(t)
end

# let
dm = port.dm
p = port.p

eqs = [vol ~ dead_volume + area * x
D(x) ~ dx
D(rho) ~ drho
rho ~ full_density(port, p)
dm ~ drho * vol * Χ1 + rho * area * dx * Χ2]
@equations begin
vol ~ dead_volume + area * x
D(x) ~ dx
D(rho) ~ drho
rho ~ full_density(port, port.p)
port.dm ~ drho * vol * Χ1 + rho * area * dx * Χ2
end

ODESystem(eqs, t, vars, pars; name, systems)
end

"""
Expand All @@ -400,33 +406,31 @@ Fixed fluid volume.
# Connectors:
- `port`: hydraulic port
"""
@component function FixedVolume(; vol, name)
pars = @parameters begin
vol = vol
@mtkmodel FixedVolume begin

@parameters begin
vol
end

systems = @named begin
@components begin
port = HydraulicPort(;)
end

vars = @variables begin
@variables begin
rho(t), [guess = liquid_density(port)]
drho(t), [guess = 0]
end

# let
dm = port.dm
p = port.p

eqs = [D(rho) ~ drho
rho ~ full_density(port, p)
dm ~ drho * vol]
@equations begin
D(rho) ~ drho
rho ~ full_density(port, port.p)
port.dm ~ drho * vol
end

ODESystem(eqs, t, vars, pars; name, systems)
end

"""
Volume(; x, dx=0, p, drho=0, dm=0, area, direction = +1, name)
Volume(; x, dx=0, p, drho=0, dm=0, area, direction = 1, name)

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.

Expand Down Expand Up @@ -463,16 +467,17 @@ dm ────► │ │ area

See also [`FixedVolume`](@ref), [`DynamicVolume`](@ref)
"""
@component function Volume(;
@mtkmodel Volume begin

#parameters
area,
direction = +1, name)
pars = @parameters begin
area = area
@structural_parameters begin
direction = 1
end

vars = @variables begin
@parameters begin
area
end

@variables begin
x(t)
dx(t)
p(t)
Expand All @@ -482,32 +487,36 @@ See also [`FixedVolume`](@ref), [`DynamicVolume`](@ref)
dm(t)
end

systems = @named begin
@components begin
port = HydraulicPort()
flange = MechanicalPort()
end

eqs = [
# connectors
port.p ~ p
port.dm ~ dm
flange.v * direction ~ dx
flange.f * direction ~ -f
@equations begin
# connectors
port.p ~ p
port.dm ~ dm
flange.v * direction ~ dx
flange.f * direction ~ -f

# differentials
D(x) ~ dx
D(rho) ~ drho
# differentials
D(x) ~ dx
D(rho) ~ drho

# physics
rho ~ liquid_density(port, p)
f ~ p * area
dm ~ drho * x * area + rho * dx * area]
# physics
rho ~ liquid_density(port, p)
f ~ p * area
dm ~ drho * x * area + rho * dx * area
end

@defaults begin
rho => liquid_density(port)
end

ODESystem(eqs, t, vars, pars; name, systems, defaults = [rho => liquid_density(port)])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

defaults = [rho => liquid_density(port)]

can be added via the @defaults block https://docs.sciml.ai/ModelingToolkit/stable/basics/MTKLanguage/#@defaults-begin-block

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this correct?

    @defaults begin
        rho => liquid_density(port)
    end

end

"""
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)
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)

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.

Expand Down
39 changes: 15 additions & 24 deletions src/Hydraulic/IsothermalCompressible/sources.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,16 @@ Hydraulic mass flow input source
- `port`: hydraulic port
- `dm`: real input
"""
@component function MassFlow(; name)
pars = []
@mtkmodel MassFlow begin

systems = @named begin
@components begin
port = HydraulicPort()
dm = RealInput()
end

vars = []
eqs = [
@equations begin
port.dm ~ -dm.u
]

ODESystem(eqs, t, vars, pars; name, systems)
end
end

"""
Expand All @@ -35,22 +31,20 @@ Fixed pressure source
# Connectors:
- `port`: hydraulic port
"""
@component function FixedPressure(; p, name)
pars = @parameters begin
p = p
end
@mtkmodel FixedPressure begin

vars = []
@parameters begin
p
end

systems = @named begin
@components begin
port = HydraulicPort()
end

eqs = [
@equations begin
port.p ~ p
]
end

ODESystem(eqs, t, vars, pars; name, systems)
end
@deprecate Source FixedPressure

Expand All @@ -63,19 +57,16 @@ input pressure source
- `port`: hydraulic port
- `p`: real input
"""
@component function Pressure(; name)
pars = []
vars = []
@mtkmodel Pressure begin

systems = @named begin
@components begin
port = HydraulicPort()
p = RealInput()
end

eqs = [
@equations begin
port.p ~ p.u
]
end

ODESystem(eqs, t, vars, pars; name, systems)
end
@deprecate InputSource Pressure
Loading