diff --git a/src/Hydraulic/IsothermalCompressible/components.jl b/src/Hydraulic/IsothermalCompressible/components.jl index be891ee4c..f7512bc48 100644 --- a/src/Hydraulic/IsothermalCompressible/components.jl +++ b/src/Hydraulic/IsothermalCompressible/components.jl @@ -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 """ @@ -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 """ @@ -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( @@ -357,18 +361,23 @@ 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)] @@ -376,17 +385,14 @@ end 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 """ @@ -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. @@ -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) @@ -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)]) 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. diff --git a/src/Hydraulic/IsothermalCompressible/sources.jl b/src/Hydraulic/IsothermalCompressible/sources.jl index ee21959d7..64b182f11 100644 --- a/src/Hydraulic/IsothermalCompressible/sources.jl +++ b/src/Hydraulic/IsothermalCompressible/sources.jl @@ -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 """ @@ -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 @@ -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