diff --git a/docs/src/connectors/connections.md b/docs/src/connectors/connections.md index 0a9d94035..28ec45c92 100644 --- a/docs/src/connectors/connections.md +++ b/docs/src/connectors/connections.md @@ -18,7 +18,7 @@ The idea behind the selection of the **through** variable is that it should be a ```math \begin{aligned} \partial {\color{blue}{across}} / \partial t \cdot c_1 = {\color{green}{through}} \\ - {\color{green}{through}} \cdot c_2 = {\color{blue}{across}} + {\color{green}{through}} \cdot c_2 = {\color{blue}{across}} \end{aligned} ``` @@ -29,7 +29,7 @@ For the Electrical domain, the across variable is *voltage* and the through vari - Energy Dissipation: ```math -\partial {\color{blue}{voltage}} / \partial t \cdot capacitance = {\color{green}{current}} +\partial {\color{blue}{voltage}} / \partial t \cdot capacitance = {\color{green}{current}} ``` - Flow: @@ -45,13 +45,13 @@ For the translation domain, choosing *velocity* for the across variable and *for - Energy Dissipation: ```math -\partial {\color{blue}{velocity}} / \partial t \cdot mass = {\color{green}{force}} +\partial {\color{blue}{velocity}} / \partial t \cdot mass = {\color{green}{force}} ``` - Flow: ```math -{\color{green}{force}} \cdot (1/damping) = {\color{blue}{velocity}} +{\color{green}{force}} \cdot (1/damping) = {\color{blue}{velocity}} ``` The diagram here shows the similarity of problems in different physical domains. @@ -65,13 +65,13 @@ Now, if we choose *position* for the across variable, a similar relationship can - Energy Dissipation: ```math -\partial^2 {\color{blue}{position}} / \partial t^2 \cdot mass = {\color{green}{force}} +\partial^2 {\color{blue}{position}} / \partial t^2 \cdot mass = {\color{green}{force}} ``` - Flow: ```math -{\color{green}{force}} \cdot (1/damping) = \partial {\color{blue}{position}} / \partial t +{\color{green}{force}} \cdot (1/damping) = \partial {\color{blue}{position}} / \partial t ``` As can be seen, we must now establish a higher order derivative to define the Energy Dissipation and Flow equations, requiring an extra equation, as will be shown in the example below. @@ -134,8 +134,8 @@ Now using the Translational library based on velocity, we can see the same relat using ModelingToolkitStandardLibrary const TV = ModelingToolkitStandardLibrary.Mechanical.Translational -@named damping = TV.Damper(d = 1, v_a_0 = 1) -@named body = TV.Mass(m = 1, v_0 = 1) +@named damping = TV.Damper(d = 1, flange_a.v = 1) +@named body = TV.Mass(m = 1, v = 1) @named ground = TV.Fixed() eqs = [connect(damping.flange_a, body.flange) @@ -167,8 +167,8 @@ Now, let's consider the position-based approach. We can build the same model wi ```@example connections const TP = ModelingToolkitStandardLibrary.Mechanical.TranslationalPosition -@named damping = TP.Damper(d = 1, v_a_0 = 1) -@named body = TP.Mass(m = 1, v_0 = 1) +@named damping = TP.Damper(d = 1, va = 1, vb = 0.0) +@named body = TP.Mass(m = 1, v = 1) @named ground = TP.Fixed(s_0 = 0) eqs = [connect(damping.flange_a, body.flange) @@ -197,10 +197,10 @@ plot(p1, p2, p3) The question then arises, can the position be plotted when using the Mechanical Translational Domain based on the Velocity Across variable? Yes, we can! There are 2 solutions: - 1. the `Mass` component will add the position variable when the `s_0` parameter is used to set an initial position. Otherwise, the component does not track the position. + 1. the `Mass` component will add the position variable when the `s` parameter is used to set an initial position. Otherwise, the component does not track the position. ```julia -@named body = TV.Mass(m = 1, v_0 = 1, s_0 = 0) +@named body = TV.Mass(m = 1, v = 1, s = 0) ``` 2. implement a `PositionSensor` @@ -220,31 +220,31 @@ In this problem, we have a mass, spring, and damper which are connected to a fix #### Damper -The damper will connect the flange/flange 1 (`flange_a`) to the mass, and flange/flange 2 (`flange_b`) to the fixed point. For both position- and velocity-based domains, we set the damping constant `d=1` and `v_a_0=1` and leave the default for `v_b_0` at 0. For the position domain, we also need to set the initial positions for `flange_a` and `flange_b`. +The damper will connect the flange/flange 1 (`flange_a`) to the mass, and flange/flange 2 (`flange_b`) to the fixed point. For both position- and velocity-based domains, we set the damping constant `d=1` and `va=1` and leave the default for `v_b_0` at 0. For the position domain, we also need to set the initial positions for `flange_a` and `flange_b`. ```@example connections -@named dv = TV.Damper(d = 1, v_a_0 = 1) -@named dp = TP.Damper(d = 1, v_a_0 = 1, s_a_0 = 3, s_b_0 = 1) +@named dv = TV.Damper(d = 1, flange_a.v = 1) +@named dp = TP.Damper(d = 1, va = 1, vb = 0.0, flange_a__s = 3, flange_b__s = 1) nothing # hide ``` #### Spring -The spring will connect the flange/flange 1 (`flange_a`) to the mass, and flange/flange 2 (`flange_b`) to the fixed point. For both position- and velocity-based domains, we set the spring constant `k=1`. The velocity domain then requires the initial velocity `v_a_0` and initial spring stretch `delta_s_0`. The position domain instead needs the initial positions for `flange_a` and `flange_b` and the natural spring length `l`. +The spring will connect the flange/flange 1 (`flange_a`) to the mass, and flange/flange 2 (`flange_b`) to the fixed point. For both position- and velocity-based domains, we set the spring constant `k=1`. The velocity domain then requires the initial velocity `va` and initial spring stretch `delta_s`. The position domain instead needs the initial positions for `flange_a` and `flange_b` and the natural spring length `l`. ```@example connections -@named sv = TV.Spring(k = 1, v_a_0 = 1, delta_s_0 = 1) -@named sp = TP.Spring(k = 1, s_a_0 = 3, s_b_0 = 1, l = 1) +@named sv = TV.Spring(k = 1, flange_a__v = 1, delta_s = 1) +@named sp = TP.Spring(k = 1, flange_a__s = 3, flange_b__s = 1, l = 1) nothing # hide ``` #### Mass -For both position- and velocity-based domains, we set the mass `m=1` and initial velocity `v_0=1`. Like the damper, the position domain requires the position initial conditions set as well. +For both position- and velocity-based domains, we set the mass `m=1` and initial velocity `v=1`. Like the damper, the position domain requires the position initial conditions set as well. ```@example connections -@named bv = TV.Mass(m = 1, v_0 = 1) -@named bp = TP.Mass(m = 1, v_0 = 1, s_0 = 3) +@named bv = TV.Mass(m = 1, v = 1) +@named bp = TP.Mass(m = 1, v = 1, s = 3) nothing # hide ``` diff --git a/src/Hydraulic/IsothermalCompressible/components.jl b/src/Hydraulic/IsothermalCompressible/components.jl index c30b85347..41ea2fcb2 100644 --- a/src/Hydraulic/IsothermalCompressible/components.jl +++ b/src/Hydraulic/IsothermalCompressible/components.jl @@ -506,7 +506,7 @@ dm ────► │ │ area ports = @named begin port = HydraulicPort(; p_int) - flange = MechanicalPort(; f_int = p_int * area) + flange = MechanicalPort(; f = p_int * area) damper = ValveBase(; p_a_int = p_int, p_b_int = p_int, area_int = 1, Cd, Cd_reverse, minimum_area) end diff --git a/src/Mechanical/MultiBody2D/components.jl b/src/Mechanical/MultiBody2D/components.jl index 6dbd39bb6..99fadd123 100644 --- a/src/Mechanical/MultiBody2D/components.jl +++ b/src/Mechanical/MultiBody2D/components.jl @@ -1,14 +1,14 @@ -@component function Link(; name, m, l, I, g, x1_0 = 0, y1_0 = 0) - pars = @parameters begin - m = m - l = l - I = I - g = g - x1_0 = x1_0 - y1_0 = y1_0 +@mtkmodel Link begin + @parameters begin + m + l + I + g + x1_0 = 0.0 + y1_0 = 0.0 end - vars = @variables begin + @variables begin (A(t) = 0), [state_priority = 10] (dA(t) = 0), [state_priority = 10] (ddA(t) = 0), [state_priority = 10] @@ -40,13 +40,16 @@ ddy_cm(t) = 0 end - @named TX1 = MechanicalPort() - @named TY1 = MechanicalPort() + @components begin + TX1 = MechanicalPort() + TY1 = MechanicalPort() - @named TX2 = MechanicalPort() - @named TY2 = MechanicalPort() + TX2 = MechanicalPort() + TY2 = MechanicalPort() + end - eqs = [D(A) ~ dA + @equations begin + D(A) ~ dA D(dA) ~ ddA D(x1) ~ dx1 D(y1) ~ dy1 @@ -57,17 +60,17 @@ D(y_cm) ~ dy_cm D(dy_cm) ~ ddy_cm - # x forces + # x forces m * ddx_cm ~ fx1 + fx2 - # y forces + # y forces m * ddy_cm ~ m * g + fy1 + fy2 - # torques + # torques I * ddA ~ -fy1 * (x2 - x1) / 2 + fy2 * (x2 - x1) / 2 + fx1 * (y2 - y1) / 2 - fx2 * (y2 - y1) / 2 - # geometry + # geometry x2 ~ l * cos(A) + x1 y2 ~ l * sin(A) + y1 x_cm ~ l * cos(A) / 2 + x1 @@ -79,8 +82,6 @@ TX2.f ~ fx2 TX2.v ~ dx2 TY2.f ~ fy2 - TY2.v ~ dy2] - - return ODESystem(eqs, t, vars, pars; name = name, systems = [TX1, TY1, TX2, TY2], - defaults = [TX1.v => 0, TY1.v => 0, TX2.v => 0, TY2.v => 0]) + TY2.v ~ dy2 + end end diff --git a/src/Mechanical/Rotational/components.jl b/src/Mechanical/Rotational/components.jl index 39586b01a..6df5d3b1c 100644 --- a/src/Mechanical/Rotational/components.jl +++ b/src/Mechanical/Rotational/components.jl @@ -1,5 +1,5 @@ """ - Fixed(;name, phi0=0.0) + Fixed(;name, phi0 = 0.0) Flange fixed in housing at a given angle. @@ -11,15 +11,20 @@ Flange fixed in housing at a given angle. - `phi0`: [`rad`] Fixed offset angle of housing """ -@component function Fixed(; name, phi0 = 0.0) - @named flange = Flange() - @parameters phi0=phi0 [description = "Fixed offset angle of flange"] - eqs = [flange.phi ~ phi0] - return compose(ODESystem(eqs, t, [], [phi0]; name = name), flange) +@mtkmodel Fixed begin + @components begin + flange = Flange() + end + @parameters begin + phi0 = 0.0, [description = "Fixed offset angle of flange"] + end + @equations begin + flange.phi ~ phi0 + end end """ - Inertia(;name, J, phi_start=0.0, w_start=0.0, a_start=0.0) + Inertia(;name, J, phi = 0.0, w = 0.0, a = 0.0) 1D-rotational component with inertia. @@ -37,29 +42,34 @@ end # Parameters: - `J`: [`kg·m²`] Moment of inertia - - `phi_start`: [`rad`] Initial value of absolute rotation angle of component - - `w_start`: [`rad/s`] Initial value of absolute angular velocity of component - - `a_start`: [`rad/s²`] Initial value of absolute angular acceleration of component """ -@component function Inertia(; name, J, phi_start = 0.0, w_start = 0.0, a_start = 0.0) - @named flange_a = Flange() - @named flange_b = Flange() - @symcheck J > 0 || throw(ArgumentError("Expected `J` to be positive")) - @parameters J=J [description = "Moment of inertia of $name"] - sts = @variables(phi(t)=phi_start, [description = "Absolute rotation angle of $name"], - w(t)=w_start, [description = "Absolute angular velocity of $name"], - a(t)=a_start, - [description = "Absolute angular acceleration of $name"],) - eqs = [phi ~ flange_a.phi +@mtkmodel Inertia begin + @parameters begin + J, [description = "Moment of inertia"] + end + @components begin + flange_a = Flange() + flange_b = Flange() + end + begin + @symcheck J > 0 || throw(ArgumentError("Expected `J` to be positive")) + end + @variables begin + phi(t) = 0.0, [description = "Absolute rotation angle"] + w(t) = 0.0, [description = "Absolute angular velocity"] + a(t) = 0.0, [description = "Absolute angular acceleration"] + end + @equations begin + phi ~ flange_a.phi phi ~ flange_b.phi D(phi) ~ w D(w) ~ a - J * a ~ flange_a.tau + flange_b.tau] - return compose(ODESystem(eqs, t, sts, [J]; name = name), flange_a, flange_b) + J * a ~ flange_a.tau + flange_b.tau + end end """ - Spring(;name, c, phi_rel0=0.0) + Spring(; name, c, phi_rel0 = 0.0) Linear 1D rotational spring @@ -78,19 +88,22 @@ Linear 1D rotational spring - `c`: [`N.m/rad`] Spring constant - `phi_rel0`: [`rad`] Unstretched spring angle """ -@component function Spring(; name, c, phi_rel0 = 0.0) - @named partial_comp = PartialCompliant() - @unpack phi_rel, tau = partial_comp - @symcheck c > 0 || throw(ArgumentError("Expected `c` to be positive")) - pars = @parameters(c=c, [description = "Spring constant of $name"], - phi_rel0=phi_rel0, - [description = "Unstretched spring angle of $name"],) - eqs = [tau ~ c * (phi_rel - phi_rel0)] - extend(ODESystem(eqs, t, [], pars; name = name), partial_comp) +@mtkmodel Spring begin + @extend phi_rel, tau = partial_comp = PartialCompliant() + begin + @symcheck c > 0 || throw(ArgumentError("Expected `c` to be positive")) + end + @parameters begin + c, [description = "Spring constant"] + phi_rel0 = 0.0, [description = "Unstretched spring angle"] + end + @equations begin + tau ~ c * (phi_rel - phi_rel0) + end end """ - Damper(;name, d) + Damper(; name, d) Linear 1D rotational damper @@ -110,17 +123,20 @@ Linear 1D rotational damper - `d`: [`N.m.s/rad`] Damping constant """ -@component function Damper(; name, d) - @named partial_comp = PartialCompliantWithRelativeStates() - @unpack w_rel, tau = partial_comp - @symcheck d > 0 || throw(ArgumentError("Expected `d` to be positive")) - pars = @parameters d=d [description = "Damping constant of $name"] - eqs = [tau ~ d * w_rel] - extend(ODESystem(eqs, t, [], pars; name = name), partial_comp) +@mtkmodel Damper begin + @extend w_rel, tau = partial_comp = PartialCompliantWithRelativeStates() + begin + @symcheck d > 0 || throw(ArgumentError("Expected `d` to be positive")) + end + @parameters begin + d, [description = "Damping constant"] + end + @equations begin + tau ~ d * w_rel + end end - """ - SpringDamper(;name, d) + SpringDamper(; name, d) Linear 1D rotational spring and damper @@ -140,23 +156,28 @@ Linear 1D rotational spring and damper - `d`: [`N.m.s/rad`] Damping constant - `c`: [`N.m/rad`] Spring constant + - `phi_rel0`: [`rad`] Unstretched spring angle """ -@component function SpringDamper(; name, c, d, phi_rel0 = 0.0) - @named partial_comp = PartialCompliantWithRelativeStates() - @unpack phi_rel, w_rel, tau = partial_comp - @variables tau_c(t) [description = "Spring torque"] - @variables tau_d(t) [description = "Damper torque"] - @parameters d=d [description = "Damping constant"] - @parameters c=c [description = "Spring constant"] - @parameters phi_rel0=phi_rel0 [description = "Unstretched spring angle"] - eqs = [tau_c ~ c * (phi_rel - phi_rel0) +@mtkmodel SpringDamper begin + @extend phi_rel, w_rel, tau = partial_comp = PartialCompliantWithRelativeStates() + @variables begin + tau_c(t), [description = "Spring torque"] + tau_d(t), [description = "Damper torque"] + end + @parameters begin + d, [description = "Damping constant"] + c, [description = "Spring constant"] + phi_rel0 = 0.0, [description = "Unstretched spring angle"] + end + @equations begin + tau_c ~ c * (phi_rel - phi_rel0) tau_d ~ d * w_rel - tau ~ tau_c + tau_d] - extend(ODESystem(eqs, t; name = name), partial_comp) + tau ~ tau_c + tau_d + end end """ - IdealGear(;name, ratio, use_support=false) + IdealGear(; name, ratio, use_support = false) Ideal gear without inertia. @@ -178,22 +199,28 @@ This element characterizes any type of gear box which is fixed in the ground and - `ratio`: Transmission ratio (flange_a.phi/flange_b.phi) - `use_support`: If support flange enabled, otherwise implicitly grounded """ -@component function IdealGear(; name, ratio, use_support = false) - @named partial_element = PartialElementaryTwoFlangesAndSupport2(use_support = use_support) - @unpack phi_support, flange_a, flange_b = partial_element - @parameters ratio=ratio [description = "Transmission ratio of $name"] - sts = @variables phi_a(t)=0.0 [ - description = "Relative angle between shaft a and the support of $name", - ] phi_b(t)=0.0 [description = "Relative angle between shaft b and the support of $name"] - eqs = [phi_a ~ flange_a.phi - phi_support +@mtkmodel IdealGear begin#(; name, ratio, use_support = false) + @parameters begin + use_support + end + @extend phi_support, flange_a, flange_b = partial_element = PartialElementaryTwoFlangesAndSupport2(use_support = use_support) + @parameters begin + ratio, [description = "Transmission ratio"] + end + @variables begin + phi_a(t) = 0.0, [description = "Relative angle between shaft a and the support"] + phi_b(t) = 0.0, [description = "Relative angle between shaft b and the support"] + end + @equations begin + phi_a ~ flange_a.phi - phi_support phi_b ~ flange_b.phi - phi_support phi_a ~ ratio * phi_b - 0 ~ ratio * flange_a.tau + flange_b.tau] - extend(ODESystem(eqs, t, sts, [ratio]; name = name), partial_element) + 0 ~ ratio * flange_a.tau + flange_b.tau + end end """ - RotationalFriction(;name, f, tau_c, w_brk, tau_brk) + RotationalFriction(; name, f, tau_c, w_brk, tau_brk) Models rotational friction with Stribeck effect, Coulomb friction and viscous friction between the two flanges. The friction torque is a function of the relative angular velocity between `flange_a` and `flange_b`. @@ -219,22 +246,22 @@ Friction model: "Armstrong, B. and C.C. de Wit, Friction Modeling and Compensati - `w_brk`: [`rad/s`] Breakaway friction velocity - `tau_brk`: [`N⋅m`] Breakaway friction torque """ -@component function RotationalFriction(; name, f, tau_c, w_brk, tau_brk) - @named partial_comp = PartialCompliantWithRelativeStates() - @unpack w_rel, tau = partial_comp - pars = @parameters(f=f, [description = "Viscous friction coefficient of $name"], - tau_c=tau_c, [description = "Coulomb friction torque of $name"], - w_brk=w_brk, [description = "Breakaway friction velocity of $name"], - tau_brk=tau_brk, - [description = "Breakaway friction torque of $name"],) - - str_scale = sqrt(2 * exp(1)) * (tau_brk - tau_c) - w_st = w_brk * sqrt(2) - w_coul = w_brk / 10 - - eqs = [ +@mtkmodel RotationalFriction begin + @extend w_rel, tau = partial_comp = PartialCompliantWithRelativeStates() + @parameters begin + f, [description = "Viscous friction coefficient"] + tau_c, [description = "Coulomb friction torque"] + w_brk, [description = "Breakaway friction velocity"] + tau_brk, [description = "Breakaway friction torque"] + end + + begin + str_scale = sqrt(2 * exp(1)) * (tau_brk - tau_c) + w_st = w_brk * sqrt(2) + w_coul = w_brk / 10 + end + @equations begin tau ~ str_scale * (exp(-(w_rel / w_st)^2) * w_rel / w_st) + - tau_c * tanh(w_rel / w_coul) + f * w_rel, # Stribeck friction + Coulomb friction + Viscous friction - ] - extend(ODESystem(eqs, t, [], pars; name = name), partial_comp) + tau_c * tanh(w_rel / w_coul) + f * w_rel # Stribeck friction + Coulomb friction + Viscous friction + end end diff --git a/src/Mechanical/Rotational/sensors.jl b/src/Mechanical/Rotational/sensors.jl index 5e95136b1..d3be89feb 100644 --- a/src/Mechanical/Rotational/sensors.jl +++ b/src/Mechanical/Rotational/sensors.jl @@ -1,5 +1,5 @@ """ - AngleSensor(;name) + AngleSensor(; name) Ideal sensor to measure the absolute flange angle @@ -8,16 +8,19 @@ Ideal sensor to measure the absolute flange angle - `flange`: [Flange](@ref) Flange of shaft from which sensor information shall be measured - `phi`: [RealOutput](@ref) Absolute angle of flange """ -@component function AngleSensor(; name) - @named flange = Flange() - @named phi = RealOutput() - eqs = [phi.u ~ flange.phi - flange.tau ~ 0] - return ODESystem(eqs, t, [], []; name = name, systems = [flange, phi]) +@mtkmodel AngleSensor begin + @components begin + flange = Flange() + phi = RealOutput() + end + @equations begin + phi.u ~ flange.phi + flange.tau ~ 0 + end end """ - SpeedSensor(;name) + SpeedSensor(; name) Ideal sensor to measure the absolute flange angular velocity @@ -26,12 +29,15 @@ Ideal sensor to measure the absolute flange angular velocity - `flange`: [Flange](@ref) Flange of shaft from which sensor information shall be measured - `w`: [RealOutput](@ref) Absolute angular velocity of flange """ -@component function SpeedSensor(; name) - @named flange = Flange() - @named w = RealOutput() - eqs = [D(flange.phi) ~ w.u - flange.tau ~ 0] - return ODESystem(eqs, t, [], []; name = name, systems = [flange, w]) +@mtkmodel SpeedSensor begin + @components begin + flange = Flange() + w = RealOutput() + end + @equations begin + D(flange.phi) ~ w.u + flange.tau ~ 0 + end end """ @@ -45,17 +51,20 @@ Ideal sensor to measure the torque between two flanges (`= flange_a.tau`) - `flange_b`: [Flange](@ref) Left flange of shaft - `tau`: [RealOutput](@ref) Torque in flange flange_a and flange_b (`tau = flange_a.tau = -flange_b.tau`) """ -@component function TorqueSensor(; name) - @named flange_a = Flange() - @named flange_b = Flange() - @named tau = RealOutput() - eqs = [flange_a.phi ~ flange_b.phi - tau.u ~ flange_a.tau] - return ODESystem(eqs, t, [], []; name = name, systems = [flange_a, flange_b, tau]) +@mtkmodel TorqueSensor begin + @components begin + flange_a = Flange() + flange_b = Flange() + tau = RealOutput() + end + @equations begin + flange_a.phi ~ flange_b.phi + tau.u ~ flange_a.tau + end end """ - RelSpeedSensor(;name) + RelSpeedSensor(; name) Ideal sensor to measure the relative angular velocity @@ -65,15 +74,19 @@ Ideal sensor to measure the relative angular velocity - `flange_b`: [Flange](@ref) Flange of shaft from which sensor information shall be measured - `w`: [RealOutput](@ref) Absolute angular velocity of flange """ -@component function RelSpeedSensor(; name) - @named flange_a = Flange() - @named flange_b = Flange() - @named w_rel = RealOutput() - @variables phi_rel(t) = 0.0 - eqs = [0 ~ flange_a.tau + flange_b.tau +@mtkmodel RelSpeedSensor begin + @components begin + flange_a = Flange() + flange_b = Flange() + w_rel = RealOutput() + end + @variables begin + phi_rel(t) = 0.0 + end + @equations begin + 0 ~ flange_a.tau + flange_b.tau phi_rel ~ flange_b.phi - flange_a.phi D(phi_rel) ~ w_rel.u - 0 ~ flange_a.tau] - return ODESystem(eqs, t, [phi_rel], []; name = name, - systems = [flange_a, flange_b, w_rel]) + 0 ~ flange_a.tau + end end diff --git a/src/Mechanical/Rotational/sources.jl b/src/Mechanical/Rotational/sources.jl index f6f78df72..35abf2c52 100644 --- a/src/Mechanical/Rotational/sources.jl +++ b/src/Mechanical/Rotational/sources.jl @@ -1,16 +1,21 @@ - -function PartialTorque(; name, use_support = false) - @named partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support) - @unpack flange, phi_support = partial_element - @variables phi(t) [ - description = "Angle of flange with respect to support (= flange.phi - support.phi)", - ] - eqs = [phi ~ flange.phi - phi_support] - return extend(ODESystem(eqs, t; name = name), partial_element) +@mtkmodel PartialTorque begin + @parameters begin + use_support + end + @extend flange, phi_support = partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support) + @variables begin + phi(t), + [ + description = "Angle of flange with respect to support (= flange.phi - support.phi)", + ] + end + @equations begin + phi ~ flange.phi - phi_support + end end """ - Torque(; name, use_support=false) + Torque(; name, use_support) Input signal acting as external torque on a flange @@ -27,21 +32,26 @@ Input signal acting as external torque on a flange - `use_support` """ -@component function Torque(; name, use_support = false) - @named partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support) - @unpack flange = partial_element - @named tau = RealInput() - eqs = [flange.tau ~ -tau.u] - return extend(ODESystem(eqs, t, [], []; name = name, systems = [tau]), partial_element) +@mtkmodel Torque begin + @parameters begin + use_support + end + @extend (flange,) = partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support) + @components begin + tau = RealInput() + end + @equations begin + flange.tau ~ -tau.u + end end """ - ConstantTorque(; name, tau_constant, use_support = false) + ConstantTorque(; name, tau_constant, use_support) Constant torque source # State variables: - + - `phi_support(t)`: [`rad`] Absolute angle of support flange, only available if `use_support = true` - `tau`: Accelerating torque acting at flange (= -flange.tau) - `w`: Angular velocity of flange with respect to support (= der(phi)) @@ -51,26 +61,31 @@ Constant torque source # Arguments: - `tau_constant`: The constant torque applied by the source -- `use_support`: Whether or not an internal support flange is added, defaults to false. +- `use_support`: Whether or not an internal support flange is added. """ -function ConstantTorque(; name, tau_constant, use_support = false) - @named partial_element = PartialTorque(; use_support) - @unpack flange, phi = partial_element - @parameters tau_constant=tau_constant [ - description = "Constant torque (if negative, torque is acting as load in positive direction of rotation)", - ] - @variables tau(t) [description = "Accelerating torque acting at flange (= -flange.tau)"] - @variables w(t) [ - description = "Angular velocity of flange with respect to support (= der(phi))", - ] - eqs = [w ~ D(phi) +@mtkmodel ConstantTorque begin #(; name, tau_constant, use_support = false) + @parameters begin + tau_constant, + [ + description = "Constant torque (if negative, torque is acting as load in positive direction of rotation)", + ] + use_support + end + @extend flange, phi = partial_element = PartialTorque(; use_support = use_support) + @variables begin + tau(t), [description = "Accelerating torque acting at flange (= -flange.tau)"] + w(t), + [description = "Angular velocity of flange with respect to support (= der(phi))"] + end + @equations begin + w ~ D(phi) tau ~ -flange.tau - tau ~ tau_constant] - return extend(ODESystem(eqs, t; name = name), partial_element) + tau ~ tau_constant + end end """ - Speed(; name, use_support=false, exact=false, f_crit=50) + Speed(; name, use_support, exact = false, f_crit = 50) Forced movement of a flange according to a reference angular velocity signal diff --git a/src/Mechanical/Rotational/utils.jl b/src/Mechanical/Rotational/utils.jl index e77c30229..b54bfd06d 100644 --- a/src/Mechanical/Rotational/utils.jl +++ b/src/Mechanical/Rotational/utils.jl @@ -1,8 +1,8 @@ -@connector function Flange(; name) - sts = @variables(phi(t), [description = "Rotation angle of flange $name"], - tau(t), [connect = Flow, description = "Cut torque in flange $name"],) - ODESystem(Equation[], t, sts, [], name = name, defaults = Dict(phi => 0.0, tau => 0.0)) +@connector Flange begin + phi(t), [description = "Rotation angle of flange"] + tau(t), [connect = Flow, description = "Cut torque in flange"] end + Base.@doc """ Support(;name) @@ -13,9 +13,9 @@ Base.@doc """ - `tau(t)`: [`N.m`] Cut torque in the flange """ Flange -@connector function Support(; name) - @named flange = Flange() - extend(ODESystem(Equation[], t, [], [], name = name), flange) +@connector Support begin + phi(t), [description = "Rotation angle of flange"] + tau(t), [connect = Flow, description = "Cut torque in flange"] end # Base.@doc """ @@ -50,83 +50,76 @@ Support/housing of a 1-dim. rotational shaft """ Support """ - PartialCompliant(;name, phi_rel_start=0.0, tau_start=0.0) + PartialCompliant(; name, phi_rel = 0.0, tau = 0.0) Partial model for the compliant connection of two rotational 1-dim. shaft flanges. # States: - - `phi_rel(t)`: [`rad`] Relative rotation angle (`flange_b.phi - flange_a.phi`) - - `tau(t)`: [`N.m`] Torque between flanges (`flange_b.tau`) + - `phi_rel(t)`: [`rad`] Relative rotation angle (`flange_b.phi - flange_a.phi`). It accepts an initial value, which defaults to 0.0. + - `tau(t)`: [`N.m`] Torque between flanges (`flange_b.tau`). It accepts an initial value, which defaults to 0.0. # Connectors: - `flange_a` [Flange](@ref) - `flange_b` [Flange](@ref) -# Parameters: - - - `phi_rel_start`: [`rad`] Initial relative rotation angle - - `tau_start`: [`N.m`] Initial torque between flanges """ -@component function PartialCompliant(; name, phi_rel_start = 0.0, tau_start = 0.0) - @named flange_a = Flange() - @named flange_b = Flange() - sts = @variables(phi_rel(t)=phi_rel_start, - [description = "Relative rotation angle between flanges"], - tau(t)=tau_start, [description = "Torque between flanges"]) - eqs = [phi_rel ~ flange_b.phi - flange_a.phi +@mtkmodel PartialCompliant begin + @components begin + flange_a = Flange() + flange_b = Flange() + end + @variables begin + phi_rel(t) = 0.0, [description = "Relative rotation angle between flanges"] + tau(t) = 0.0, [description = "Torque between flanges"] + end + @equations begin + phi_rel ~ flange_b.phi - flange_a.phi flange_b.tau ~ tau - flange_a.tau ~ -tau] - return compose(ODESystem(eqs, t, sts, []; name = name), flange_a, flange_b) + flange_a.tau ~ -tau + end end """ - PartialCompliantWithRelativeStates(;name, phi_rel_start=0.0, tau_start=0.0) + PartialCompliantWithRelativeStates(; name, phi_rel = 0.0, tau = 0.0) Partial model for the compliant connection of two rotational 1-dim. shaft flanges where the relative angle and speed are used as preferred states # States: - - `phi_rel(t)`: [`rad`] Relative rotation angle (= flange_b.phi - flange_a.phi) - - `w_rel(t)`: [`rad/s`] Relative angular velocity (= D(phi_rel)) - - `a_rel(t)`: [`rad/s²`] Relative angular acceleration (= D(w_rel)) - - `tau(t)`: [`N.m`] Torque between flanges (= flange_b.tau) + - `phi_rel(t)`: [`rad`] Relative rotation angle (= flange_b.phi - flange_a.phi). It accepts an initial value, which defaults to 0.0. + - `w_rel(t)`: [`rad/s`] Relative angular velocity (= D(phi_rel)). It accepts an initial value, which defaults to 0.0. + - `a_rel(t)`: [`rad/s²`] Relative angular acceleration (= D(w_rel)). It accepts an initial value, which defaults to 0.0. + - `tau(t)`: [`N.m`] Torque between flanges (= flange_b.tau). It accepts an initial value, which defaults to 0.0. # Connectors: - `flange_a` [Flange](@ref) - `flange_b` [Flange](@ref) - -# Parameters: - - - `phi_rel_start`: [`rad`] Initial relative rotation angle - - `w_rel_start`: [`rad/s`] Initial relative angular velocity (= D(phi_rel)) - - `a_rel_start`: [`rad/s²`] Initial relative angular acceleration (= D(w_rel)) - - `tau_start`: [`N.m`] Initial torque between flanges """ -@component function PartialCompliantWithRelativeStates(; name, phi_rel_start = 0.0, - w_start = 0.0, - a_start = 0.0, tau_start = 0.0) - @named flange_a = Flange() - @named flange_b = Flange() - sts = @variables(phi_rel(t)=phi_rel_start, - [description = "Relative rotation angle between flanges"], - w_rel(t)=w_start, - [description = "Relative angular velocity between flanges"], - a_rel(t)=a_start, - [description = "Relative angular acceleration between flanges"], - tau(t)=tau_start, [description = "Torque between flanges"],) - eqs = [phi_rel ~ flange_b.phi - flange_a.phi +@mtkmodel PartialCompliantWithRelativeStates begin + @components begin + flange_a = Flange() + flange_b = Flange() + end + @variables begin + phi_rel(t) = 0.0, [description = "Relative rotation angle between flanges"] + w_rel(t) = 0.0, [description = "Relative angular velocity between flanges"] + a_rel(t) = 0.0, [description = "Relative angular acceleration between flanges"] + tau(t) = 0.0, [description = "Torque between flanges"] + end + @equations begin + phi_rel ~ flange_b.phi - flange_a.phi D(phi_rel) ~ w_rel D(w_rel) ~ a_rel flange_b.tau ~ tau - flange_a.tau ~ -tau] - return compose(ODESystem(eqs, t, sts, []; name = name), flange_a, flange_b) + flange_a.tau ~ -tau + end end """ - PartialElementaryOneFlangeAndSupport2(;name, use_support=false) + PartialElementaryOneFlangeAndSupport2(; name, use_support = false) Partial model for a component with one rotational 1-dim. shaft flange and a support used for textual modeling, i.e., for elementary models diff --git a/src/Mechanical/Translational/Translational.jl b/src/Mechanical/Translational/Translational.jl index b6dc7baff..bb9d4aa01 100644 --- a/src/Mechanical/Translational/Translational.jl +++ b/src/Mechanical/Translational/Translational.jl @@ -4,6 +4,7 @@ Library to model 1-dimensional, translational mechanical systems module Translational using ModelingToolkit, Symbolics +using ModelingToolkit: getdefault using ModelingToolkitStandardLibrary.Blocks: RealInput, RealOutput using IfElse: ifelse diff --git a/src/Mechanical/Translational/components.jl b/src/Mechanical/Translational/components.jl index db7f1f8ac..959c2aa5e 100644 --- a/src/Mechanical/Translational/components.jl +++ b/src/Mechanical/Translational/components.jl @@ -7,18 +7,20 @@ Use to close a system that has un-connected `MechanicalPort`'s where the force s - `flange`: 1-dim. translational flange """ -@component function Free(; name) - @named flange = MechanicalPort() - vars = @variables f(t) = 0 - eqs = [ - flange.f ~ f, - ] - return compose(ODESystem(eqs, t, vars, []; name, defaults = [flange.v => 0]), - flange) +@mtkmodel Free begin + @components begin + flange = MechanicalPort() + end + @variables begin + f(t) = 0.0 + end + @equations begin + flange.f ~ f + end end """ - Fixed(;name) + Fixed(; name) Fixes a flange position (velocity = 0) @@ -26,11 +28,13 @@ Fixes a flange position (velocity = 0) - `flange`: 1-dim. translational flange """ -@component function Fixed(; name) - @named flange = MechanicalPort() - eqs = [flange.v ~ 0] - return compose(ODESystem(eqs, t, [], []; name = name, defaults = [flange.v => 0]), - flange) +@mtkmodel Fixed begin + @components begin + flange = MechanicalPort() + end + @equations begin + flange.v ~ 0 + end end """ @@ -54,23 +58,22 @@ Sliding mass with inertia - `flange`: 1-dim. translational flange """ -@component function Mass(; name, v_0 = 0.0, m, s_0 = nothing, g = nothing) +@component function Mass(; name, v = 0.0, m, s = nothing, g = nothing) pars = @parameters begin m = m - v_0 = v_0 end + @named flange = MechanicalPort(; v = v) + vars = @variables begin - v(t) = v_0 + v(t) = v f(t) = 0 end - @named flange = MechanicalPort() - eqs = [flange.v ~ v flange.f ~ f] # gravity option - if !isnothing(g) + if g !== nothing @parameters g = g push!(pars, g) push!(eqs, D(v) ~ f / m + g) @@ -79,32 +82,29 @@ Sliding mass with inertia end # position option - if !isnothing(s_0) - @parameters s_0 = s_0 - push!(pars, s_0) - - @variables s(t) = s_0 + if s !== nothing + @variables s(t) = s push!(vars, s) push!(eqs, D(s) ~ v) end - return compose(ODESystem(eqs, t, vars, pars; name = name, defaults = [flange.v => v_0]), + return compose(ODESystem(eqs, t, vars, pars; name = name), flange) end const REL = Val(:relative) """ - Spring(; name, k, delta_s_0 = 0.0, v_a_0=0.0, v_b_0=0.0) + Spring(; name, k, delta_s = 0.0, va=0.0, v_b_0=0.0) Linear 1D translational spring # Parameters: - `k`: [N/m] Spring constant - - `delta_s_0`: initial spring stretch - - `v_a_0`: [m/s] Initial value of absolute linear velocity at flange_a (default 0 m/s) + - `delta_s`: initial spring stretch + - `va`: [m/s] Initial value of absolute linear velocity at flange_a (default 0 m/s) - `v_b_0`: [m/s] Initial value of absolute linear velocity at flange_b (default 0 m/s) # Connectors: @@ -112,104 +112,90 @@ Linear 1D translational spring - `flange_a`: 1-dim. translational flange on one side of spring - `flange_b`: 1-dim. translational flange on opposite side of spring """ -@component function Spring(; name, k, delta_s_0 = 0.0, v_a_0 = 0.0, v_b_0 = 0.0) - Spring(REL; name, k, delta_s_0, v_a_0, v_b_0) +@component function Spring(; name, k, delta_s = 0.0, flange_a__v = 0.0, flange_b__v = 0.0) + Spring(REL; name, k, delta_s, flange_a__v, flange_b__v) end # default -@component function Spring(::Val{:relative}; name, k, delta_s_0 = 0.0, v_a_0 = 0.0, - v_b_0 = 0.0) +@component function Spring(::Val{:relative}; name, k, delta_s = 0.0, flange_a__v = 0.0, + flange_b__v = 0.0) pars = @parameters begin k = k - delta_s_0 = delta_s_0 - v_a_0 = v_a_0 - v_b_0 = v_b_0 end vars = @variables begin - delta_s(t) = delta_s_0 + delta_s(t) = delta_s f(t) = 0 end - @named flange_a = MechanicalPort() - @named flange_b = MechanicalPort() + @named flange_a = MechanicalPort(; v = flange_a__v) + @named flange_b = MechanicalPort(; v = flange_b__v) eqs = [D(delta_s) ~ flange_a.v - flange_b.v f ~ k * delta_s flange_a.f ~ +f flange_b.f ~ -f] - return compose(ODESystem(eqs, t, vars, pars; name = name, - defaults = [flange_a.v => v_a_0, flange_b.v => v_b_0]), + return compose(ODESystem(eqs, t, vars, pars; name = name), flange_a, - flange_b) #flange_a.f => +k*delta_s_0, flange_b.f => -k*delta_s_0 + flange_b) #flange_a.f => +k*delta_s, flange_b.f => -k*delta_s end const ABS = Val(:absolute) -@component function Spring(::Val{:absolute}; name, k, s_a_0 = 0, s_b_0 = 0, v_a_0 = 0.0, - v_b_0 = 0.0, - l = 0) +@component function Spring(::Val{:absolute}; name, k, sa = 0, sb = 0, flange_a__v = 0.0, + flange_b__v = 0.0, l = 0) pars = @parameters begin k = k - s_a_0 = s_a_0 - s_b_0 = s_b_0 - v_a_0 = v_a_0 - v_b_0 = v_b_0 l = l end vars = @variables begin - s1(t) = s_a_0 - s2(t) = s_b_0 + sa(t) = sa + sb(t) = sb f(t) = 0 end - @named flange_a = MechanicalPort() - @named flange_b = MechanicalPort() + @named flange_a = MechanicalPort(; v = flange_a__v) + @named flange_b = MechanicalPort(; v = flange_b__v) - eqs = [D(s1) ~ flange_a.v - D(s2) ~ flange_b.v - f ~ k * (s1 - s2 - l) #delta_s + eqs = [D(sa) ~ flange_a.v + D(sb) ~ flange_b.v + f ~ k * (sa - sb - l) #delta_s flange_a.f ~ +f flange_b.f ~ -f] - return compose(ODESystem(eqs, t, vars, pars; name = name, - defaults = [flange_a.v => v_a_0, flange_b.v => v_b_0]), + return compose(ODESystem(eqs, t, vars, pars; name = name), flange_a, - flange_b) #, flange_a.f => k * (s_a_0 - s_b_0 - l) + flange_b) #, flange_a.f => k * (flange_a__s - flange_b__s - l) end """ - Damper(; name, d, v_a_0=0.0, v_b_0=0.0) + Damper(; name, d, flange_a.v = 0.0, flange_b.v = 0.0) Linear 1D translational damper # Parameters: - `d`: [N.s/m] Damping constant - - `v_a_0`: [m/s] Initial value of absolute linear velocity at flange_a (default 0 m/s) - - `v_b_0`: [m/s] Initial value of absolute linear velocity at flange_b (default 0 m/s) # Connectors: - - `flange_a`: 1-dim. translational flange on one side of damper - - `flange_b`: 1-dim. translational flange on opposite side of damper + - `flange_a`: 1-dim. translational flange on one side of damper. Initial value of state `v` is set to 0.0 m/s. + - `flange_b`: 1-dim. translational flange on opposite side of damper. Initial value of state `v` is set to 0.0 m/s. """ -@component function Damper(; name, d, v_a_0 = 0.0, v_b_0 = 0.0) - pars = @parameters begin - d = d - v_a_0 = v_a_0 - v_b_0 = v_b_0 +@mtkmodel Damper begin + @parameters begin + d end - vars = @variables begin - v(t) = v_a_0 - v_b_0 + @variables begin + v(t) f(t) = 0.0 end - @named flange_a = MechanicalPort() - @named flange_b = MechanicalPort() + @components begin + flange_a = MechanicalPort(; v = 0.0) + flange_b = MechanicalPort(; v = 0.0) + end - eqs = [v ~ flange_a.v - flange_b.v + @equations begin + v ~ flange_a.v - flange_b.v f ~ v * d flange_a.f ~ +f - flange_b.f ~ -f] - return compose(ODESystem(eqs, t, vars, pars; name = name, - defaults = [flange_a.v => v_a_0, flange_b.v => v_b_0]), - flange_a, - flange_b) #flange_a.f => +(v_a_0 - v_b_0)*d, flange_b.f => -(v_a_0 - v_b_0)*d + flange_b.f ~ -f + end end diff --git a/src/Mechanical/Translational/sensors.jl b/src/Mechanical/Translational/sensors.jl index 5e14f2c69..ec778ee58 100644 --- a/src/Mechanical/Translational/sensors.jl +++ b/src/Mechanical/Translational/sensors.jl @@ -8,47 +8,44 @@ Linear 1D force input sensor. - `flange`: 1-dim. translational flange - `output`: real output """ -@component function ForceSensor(; name) - systems = @named begin +@mtkmodel ForceSensor begin + @components begin flange = MechanicalPort() output = RealOutput() end - vars = pars = [] - eqs = [ - flange.f ~ -output.u, - ] - - ODESystem(eqs, t, vars, pars; name, systems) + @equations begin + flange.f ~ -output.u + end end """ - PositionSensor(; s_0 = 0, name) + PositionSensor(; s = 0, name) Linear 1D position input sensor. -# Parameters: +# States: -- `s_0`: [m] initial value of absolute position +- `s`: [m] absolute position (with initial value of 0.0) # Connectors: - `flange`: 1-dim. translational flange - `output`: real output """ -@component function PositionSensor(; s_0 = 0, name) - systems = @named begin +@mtkmodel PositionSensor begin + @components begin flange = MechanicalPort() output = RealOutput() end - pars = @parameters s_0 = s_0 - vars = @variables s(t) = s_0 + @variables begin + s(t) = 0.0 + end - eqs = [D(s) ~ flange.v + @equations begin + D(s) ~ flange.v output.u ~ s - flange.f ~ 0] - - ODESystem(eqs, t, vars, pars; name, systems, - defaults = [flange.v => 0, output.u => s_0]) + flange.f ~ 0.0 + end end diff --git a/src/Mechanical/Translational/sources.jl b/src/Mechanical/Translational/sources.jl index 2e987b194..4d3e27f24 100644 --- a/src/Mechanical/Translational/sources.jl +++ b/src/Mechanical/Translational/sources.jl @@ -6,78 +6,67 @@ Linear 1D force input source # Connectors: - `flange`: 1-dim. translational flange - - `f`: real input + - `f`: real input """ -@component function Force(; name) - systems = @named begin - flange = MechanicalPort() +@mtkmodel Force begin + @components begin + flange = MechanicalPort(; v = 0.0) f = RealInput() end - vars = pars = [] - eqs = [ - flange.f ~ -f.u, - ] - - ODESystem(eqs, t, vars, pars; name, systems, defaults = [flange.v => 0]) + @equations begin + flange.f ~ -f.u + end end """ - Position(; s_0 = 0, name) + Position(; s.u_start = 0.0, name) Linear 1D position input source -# Parameters: - -- `s_0`: [m] initial value of absolute position - # Connectors: - `flange`: 1-dim. translational flange - - `s`: real input + - `s`: real input. `s.u_start` accepts an initial value, which It accepts an initial value, which defaults to 0.0. """ -@component function Position(solves_force = true; s_0 = 0, name) +@component function Position(; solves_force = true, s__u_start = 0, name) systems = @named begin flange = MechanicalPort() s = RealInput() end - pars = @parameters s_0 = s_0 - vars = @variables x(t) = s_0 + vars = @variables x(t) eqs = [D(x) ~ flange.v s.u ~ x] !solves_force && push!(eqs, 0 ~ flange.f) - ODESystem(eqs, t, vars, pars; name, systems, defaults = [flange.v => 0, s.u => s_0]) + ODESystem(eqs, t, vars, []; + name, systems, defaults = [flange.v => 0, s.u => s__u_start]) end -@component function Velocity(solves_force = true; name) +@component function Velocity(; solves_force = true, name) systems = @named begin flange = MechanicalPort() v = RealInput() end - pars = [] - vars = [] - eqs = [ v.u ~ flange.v, ] !solves_force && push!(eqs, 0 ~ flange.f) - ODESystem(eqs, t, vars, pars; name, systems, defaults = [flange.v => 0]) + ODESystem(eqs, t, [], []; name, systems, defaults = [flange.v => 0]) end -@component function Acceleration(solves_force = true; s_0 = 0, name) +@component function Acceleration(solves_force = true; s__u_start = 0, name) systems = @named begin flange = MechanicalPort() - a = RealInput() + a = RealInput(; u_start = s__u_start) end - pars = [] vars = @variables v(t) = 0 eqs = [v ~ flange.v @@ -85,5 +74,5 @@ end !solves_force && push!(eqs, 0 ~ flange.f) - ODESystem(eqs, t, vars, pars; name, systems, defaults = [flange.v => 0]) + ODESystem(eqs, t, vars, []; name, systems, defaults = [flange.v => 0]) end diff --git a/src/Mechanical/Translational/utils.jl b/src/Mechanical/Translational/utils.jl index 29113ea6d..7184d6002 100644 --- a/src/Mechanical/Translational/utils.jl +++ b/src/Mechanical/Translational/utils.jl @@ -1,13 +1,6 @@ -@connector function MechanicalPort(; name, f_int = 0, v_int = 0) - pars = @parameters begin - f_int = f_int - v_int = v_int - end - vars = @variables begin - v(t) = v_int - f(t), [connect = Flow] - end - ODESystem(Equation[], t, vars, pars; name, defaults = [f => f_int]) +@connector MechanicalPort begin + v(t) = 0.0 + f(t) = 0.0, [connect = Flow] end Base.@doc """ MechanicalPort(;name) diff --git a/src/Mechanical/TranslationalModelica/components.jl b/src/Mechanical/TranslationalModelica/components.jl index d18e7c50c..ad8c92b82 100644 --- a/src/Mechanical/TranslationalModelica/components.jl +++ b/src/Mechanical/TranslationalModelica/components.jl @@ -1,5 +1,5 @@ """ - Fixed(;name, s0=0.0) + Fixed(; name, s0 = 0.0) Flange fixed in housing at a given position. @@ -11,52 +11,57 @@ Flange fixed in housing at a given position. - `flange: 1-dim. translational flange` """ -function Fixed(; name, s0 = 0.0) - pars = @parameters s0 = s0 - vars = [] - - @named flange = Flange() - - eqs = [flange.s ~ s0] - - return compose(ODESystem(eqs, t, vars, pars; name = name, defaults = [flange.s => s0]), - flange) +@mtkmodel Fixed begin + @parameters begin + s0 + end + + @components begin + flange = Flange(; s = 0.0) + end + + @equations begin + flange.s ~ s0 + end end """ - Mass(; name, m, s0 = 0.0, v0 = 0.0) + Mass(; name, m, s, v = 0.0) Sliding mass with inertia # Parameters: - `m`: [kg] Mass of sliding mass - - `s0`: [m] Initial value of absolute position of sliding mass - - `v0`: [m/s] Initial value of absolute linear velocity of sliding mass # States: - - `s`: [m] Absolute position of sliding mass - - `v`: [m/s] Absolute linear velocity of sliding mass (= D(s)) + - `s`: [m] Absolute position of sliding mass. It accepts an initial value, which defaults to 0.0. + - `v`: [m/s] Absolute linear velocity of sliding mass (= D(s)). It accepts an initial value, which defaults to 0.0. # Connectors: - `flange: 1-dim. translational flange of mass` """ -function Mass(m; name, s0 = 0.0, v0 = 0.0) - @named pr = PartialRigid(; L = 0, s0) - @unpack flange_a, flange_b, s = pr - @parameters m=m [description = "Mass of sliding mass [kg]"] - @variables v(t)=v0 [description = "Absolute linear velocity of sliding mass [m/s]"] - @variables a(t)=0 [description = "Absolute linear acceleration of sliding mass [m/s^2]"] - eqs = [v ~ D(s) +@mtkmodel Mass begin + @parameters begin + m = 0.0, [description = "Mass of sliding mass [kg]"] + end + @variables begin + s + v(t) = 0.0, [description = "Absolute linear velocity of sliding mass [m/s]"] + a(t) = 0.0, [description = "Absolute linear acceleration of sliding mass [m/s^2]"] + end + @extend flange_a, flange_b, s = pr = PartialRigid(; L = 0.0, s = s) + @equations begin + v ~ D(s) a ~ D(v) - m * a ~ flange_a.f + flange_b.f] - return extend(ODESystem(eqs, t; name), pr) + m * a ~ flange_a.f + flange_b.f + end end """ - Spring(c; name, s_rel0=0) + Spring(; c= 0.0, name, s_rel0 = 0) Linear 1D translational spring @@ -70,18 +75,20 @@ Linear 1D translational spring - `flange_a: 1-dim. translational flange on one side of spring` - `flange_b: 1-dim. translational flange on opposite side of spring` #default function """ -function Spring(c; name, s_rel0 = 0) - @named pc = PartialCompliant() - @unpack flange_a, flange_b, s_rel, f = pc - @parameters c=c [description = "Spring constant [N/m]"] - @parameters s_rel0=s_rel0 [description = "Unstretched spring length [m]"] - - eqs = [f ~ c * (s_rel - s_rel0)] - return extend(ODESystem(eqs, t; name), pc) +@mtkmodel Spring begin + @extend flange_a, flange_b, s_rel, f = pc = PartialCompliant() + @parameters begin + c = 0.0, [description = "Spring constant [N/m]"] + s_rel0 = 0.0, [description = "Unstretched spring length [m]"] + end + + @equations begin + f ~ c * (s_rel - s_rel0) + end end """ - Damper(d; name) + Damper(; name, d = 0.0) Linear 1D translational damper @@ -94,11 +101,16 @@ Linear 1D translational damper - `flange_a: 1-dim. translational flange on one side of damper` - `flange_b: 1-dim. translational flange on opposite side of damper` """ -function Damper(d; name) - @named pc = PartialCompliantWithRelativeStates() - @unpack flange_a, flange_b, v_rel, f = pc - @parameters d=d [description = "Damping constant [Ns/m]"] - @variables lossPower(t)=0 [description = "Power dissipated by the damper [W]"] - eqs = [f ~ d * v_rel; lossPower ~ f * v_rel] - return extend(ODESystem(eqs, t; name), pc) +@mtkmodel Damper begin + @extend flange_a, flange_b, v_rel, f = pc = PartialCompliantWithRelativeStates() + @parameters begin + d = 0.0, [description = "Damping constant [Ns/m]"] + end + @variables begin + lossPower(t) = 0.0, [description = "Power dissipated by the damper [W]"] + end + @equations begin + f ~ d * v_rel + lossPower ~ f * v_rel + end end diff --git a/src/Mechanical/TranslationalModelica/sources.jl b/src/Mechanical/TranslationalModelica/sources.jl index 3854cb82b..0110ed2d2 100644 --- a/src/Mechanical/TranslationalModelica/sources.jl +++ b/src/Mechanical/TranslationalModelica/sources.jl @@ -1,12 +1,17 @@ """ - Force(;name) + Force(;name) Input signal acting as external force on a flange """ -function Force(; name, use_support = false) - @named partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support) - @unpack flange = partial_element - @named f = RealInput() # Accelerating force acting at flange (= -flange.tau) - eqs = [flange.f ~ -f.u] - return extend(ODESystem(eqs, t, [], []; name = name, systems = [f]), partial_element) +@mtkmodel Force begin + @parameters begin + use_support + end + @extend (flange,) = partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support) + @components begin + f = RealInput() # Accelerating force acting at flange (= -flange.tau) + end + @equations begin + flange.f ~ -f.u + end end diff --git a/src/Mechanical/TranslationalModelica/utils.jl b/src/Mechanical/TranslationalModelica/utils.jl index 6e184accb..a12016087 100644 --- a/src/Mechanical/TranslationalModelica/utils.jl +++ b/src/Mechanical/TranslationalModelica/utils.jl @@ -1,9 +1,6 @@ -@connector function Flange(; name) - vars = @variables begin - s(t) - f(t), [connect = Flow] - end - ODESystem(Equation[], t, vars, [], name = name, defaults = Dict(f => 0.0)) +@connector Flange begin + s(t) + f(t), [connect = Flow] end Base.@doc """ Flange(;name) @@ -15,9 +12,9 @@ Base.@doc """ - `f`: [N] Cut force into the flange """ Flange -@connector function Support(; name) - @named flange = Flange() - extend(ODESystem(Equation[], t, name = name), flange) +@connector Support begin + s(t) + f(t), [connect = Flow] end Base.@doc """ Support(;name) @@ -29,78 +26,66 @@ Support/housing 1-dim. translational flange. - `f`: [N] Cut force into the flange """ Support -function PartialTwoFlanges(; name) - @named flange_a = Flange() # (left) driving flange (flange axis directed into cut plane, e. g. from left to right) - @named flange_b = Flange() # (right) driven flange (flange axis directed out of cut plane) - compose(ODESystem([], t; name), flange_a, flange_b) +@mtkmodel PartialTwoFlanges begin + @components begin + flange_a = Flange() # (left) driving flange (flange axis directed into cut plane, e. g. from left to right) + flange_b = Flange() # (right) driven flange (flange axis directed out of cut plane) + end end """ - PartialCompliant(;name, s_rel_start=0.0, f_start=0.0) + PartialCompliant(; name, s_rel = 0.0, f = 0.0) Partial model for the compliant connection of two translational 1-dim. flanges. -# Parameters: - - - `s_rel_start`: [m] Initial relative distance between the flanges - - `f_start`: [N] Initial force between flanges - # States: - - `s_rel`: [m] Relative distance (= flange_b.s - flange_a.s) - - `f`: [N] Force between flanges (= flange_b.f) + - `s_rel`: [m] Relative distance (= flange_b.s - flange_a.s). It accepts an initial value, which defaults to 0.0. + - `f`: [N] Force between flanges (= flange_b.f). It accepts an initial value, which defaults to 0.0. """ -function PartialCompliant(; name, s_rel_start = 0.0, f_start = 0.0) - @named pt = PartialTwoFlanges() - @unpack flange_a, flange_b = pt - @variables s_rel(t)=s_rel_start [ - description = "Relative distance between flanges flange_b.s - flange_a.s", - ] - @variables f(t)=f_start [ - description = "Force between flanges (positive in direction of flange axis R)", - ] +@mtkmodel PartialCompliant begin + @extend (flange_a, flange_b) = pt = PartialTwoFlanges() + @variables begin + s_rel(t) = 0.0, [description = "Relative distance between flanges"] + f(t) = 0.0, [description = "Force between flanges"] + end - eqs = [s_rel ~ flange_b.s - flange_a.s + @equations begin + s_rel ~ flange_b.s - flange_a.s flange_b.f ~ +f - flange_a.f ~ -f] - return extend(ODESystem(eqs, t; name = name), pt) + flange_a.f ~ -f + end end """ - PartialCompliantWithRelativeStates(;name, s_rel_start=0.0, v_rel_start=0.0, f_start=0.0) + PartialCompliantWithRelativeStates(;name, s_rel = 0.0, v_rel = 0.0, f = 0.0) Partial model for the compliant connection of two translational 1-dim. flanges. -# Parameters: - - - `s_rel_start`: [m] Initial relative distance - - `v_rel_start`: [m/s] Initial relative linear velocity (= der(s_rel)) - -# States: + # States: - - `s_rel`: [m] Relative distance (= flange_b.phi - flange_a.phi) - - `v_rel`: [m/s] Relative linear velocity (= der(s_rel)) - - `f`: [N] Force between flanges (= flange_b.f) + - `s_rel`: [m] Relative distance (= flange_b.phi - flange_a.phi). It accepts an initial value, which defaults to 0.0. + - `v_rel`: [m/s] Relative linear velocity (= der(s_rel)). It accepts an initial value, which defaults to 0.0. + - `f`: [N] Force between flanges (= flange_b.f). It accepts an initial value, which defaults to 0.0. """ -function PartialCompliantWithRelativeStates(; name, s_rel_start = 0, v_rel_start = 0, - f_start = 0) - @named pt = PartialTwoFlanges() - @unpack flange_a, flange_b = pt - @variables s_rel(t)=s_rel_start [ - description = "Relative distance between flanges flange_b.s - flange_a.s", - ] - @variables v_rel(t)=v_rel_start [description = "Relative linear velocity (= D(s_rel))"] - @variables f(t)=f_start [description = "Forces between flanges (= flange_b.f)"] +@mtkmodel PartialCompliantWithRelativeStates begin + @extend flange_a, flange_b = pt = PartialTwoFlanges() + @variables begin + s_rel(t) = 0.0, [description = "Relative distance between flanges"] + v_rel(t) = 0.0, [description = "Relative linear velocity))"] + f(t) = 0.0, [description = "Forces between flanges"] + end - eqs = [s_rel ~ flange_b.s - flange_a.s + @equations begin + s_rel ~ flange_b.s - flange_a.s v_rel ~ D(s_rel) flange_b.f ~ f - flange_a.f ~ -f] - return extend(ODESystem(eqs, t; name = name), pt) + flange_a.f ~ -f + end end """ - PartialElementaryOneFlangeAndSupport2(;name, use_support=false) + PartialElementaryOneFlangeAndSupport2(; name, use_support = false) Partial model for a component with one translational 1-dim. shaft flange and a support used for textual modeling, i.e., for elementary models @@ -130,7 +115,7 @@ function PartialElementaryOneFlangeAndSupport2(; name, use_support = false) end """ - PartialElementaryTwoFlangesAndSupport2(;name, use_support=false) + PartialElementaryTwoFlangesAndSupport2(; name, use_support = false) Partial model for a component with two translational 1-dim. flanges and a support used for textual modeling, i.e., for elementary models @@ -161,16 +146,16 @@ function PartialElementaryTwoFlangesAndSupport2(; name, use_support = false) end end -function PartialRigid(; name, L = 0, s0 = 0) - @named ptf = PartialTwoFlanges() - @unpack flange_a, flange_b = ptf - @variables s(t)=s0 [ - description = "Absolute position of center of component (s = flange_a.s + L/2 = flange_b.s - L/2)", - ] - @parameters L=L [ - description = "Length of component, from left flange to right flange (= flange_b.s - flange_a.s)", - ] - eqs = [flange_a.s ~ s - L / 2 - flange_b.s ~ s + L / 2] - return extend(ODESystem(eqs, t; name = name), ptf) +@mtkmodel PartialRigid begin + @extend flange_a, flange_b = ptf = PartialTwoFlanges() + @variables begin + s(t) = 0.0, [description = "Absolute position of center of component"] + end + @parameters begin + L = 0.0, [description = "Length of component, from left flange to right flange"] + end + @equations begin + flange_a.s ~ s - L / 2 + flange_b.s ~ s + L / 2 + end end diff --git a/src/Mechanical/TranslationalPosition/components.jl b/src/Mechanical/TranslationalPosition/components.jl index f23446b70..e1901cb24 100644 --- a/src/Mechanical/TranslationalPosition/components.jl +++ b/src/Mechanical/TranslationalPosition/components.jl @@ -11,20 +11,20 @@ Flange fixed in housing at a given position. - `flange: 1-dim. translational flange` """ -@component function Fixed(; name, s_0 = 0.0) - pars = @parameters s_0 = s_0 - vars = [] - - @named flange = Flange() - - eqs = [flange.s ~ s_0] - - return compose(ODESystem(eqs, t, vars, pars; name = name, defaults = [flange.s => s_0]), - flange) +@mtkmodel Fixed begin + @parameters begin + s_0 + end + @components begin + flange = Flange(; s = s_0) + end + @equations begin + flange.s ~ s_0 + end end """ - Mass(; name, m, s_0 = 0.0, v_0 = 0.0) + Mass(; name, m, s = 0.0, v = 0.0) Sliding mass with inertia @@ -43,69 +43,62 @@ Sliding mass with inertia - `flange: 1-dim. translational flange of mass` """ -@component function Mass(; name, m, s_0 = 0.0, v_0 = 0.0) - @named flange = Flange() - pars = @parameters begin - m = m - s_0 = s_0 - v_0 = v_0 +@mtkmodel Mass begin + @parameters begin + m end - vars = @variables begin - s(t) = s_0 - v(t) = v_0 - f(t) = 0 + @variables begin + s(t) = 0.0 + v(t) = 0.0 + f(t) = 0.0 + end + @components begin + flange = Flange(; s = s) end - eqs = [flange.s ~ s + @equations begin + flange.s ~ s flange.f ~ f D(s) ~ v - D(v) ~ f / m] - return compose(ODESystem(eqs, t, vars, pars; name = name, defaults = [flange.s => s_0]), - flange) + D(v) ~ f / m + end end const REL = Val(:relative) -@component function Spring(::Val{:relative}; name, k, v_a_0 = 0.0, v_b_0 = 0.0, - delta_s_0 = 0, - s_a_0 = 0, - s_b_0 = 0) +@component function Spring(::Val{:relative}; name, k, va = 0.0, vb = 0.0, + delta_s = 0, flange_a__s = 0, flange_b__s = 0) pars = @parameters begin k = k - v_a_0 = v_a_0 - v_b_0 = v_b_0 - s_a_0 = s_a_0 - s_b_0 = s_b_0 - delta_s_0 = delta_s_0 end vars = @variables begin - v1(t) = v_a_0 - v2(t) = v_b_0 - delta_s(t) = delta_s_0 - f(t) = delta_s_0 * k + va(t) = va + vb(t) = vb + delta_s(t) = delta_s + f(t) = delta_s * k end @named flange_a = Flange() @named flange_b = Flange() - eqs = [D(flange_a.s) ~ v1 - D(flange_b.s) ~ v2 - D(delta_s) ~ v1 - v2 + eqs = [D(flange_a.s) ~ va + D(flange_b.s) ~ vb + D(delta_s) ~ va - vb f ~ k * delta_s flange_a.f ~ +f flange_b.f ~ -f] return compose(ODESystem(eqs, t, vars, pars; name = name, defaults = [ - flange_a.s => s_a_0, - flange_b.s => s_b_0, - flange_a.f => +delta_s_0 * k, - flange_b.f => -delta_s_0 * k, + flange_a.s => flange_a__s, + flange_b.s => flange_b__s, + flange_a.f => +delta_s * k, + flange_b.f => -delta_s * k, ]), flange_a, flange_b) end const ABS = Val(:absolute) """ - Spring(; name, k, s_a_0 = 0, s_b_0 = 0, l=0) + Spring(; name, k, flange_a__s = 0, flange_b__s = 0, l=0) Linear 1D translational spring @@ -113,90 +106,76 @@ Linear 1D translational spring - `k`: [N/m] Spring constant - `l`: Unstretched spring length - - `s_a_0`: [m] Initial value of absolute position of flange_a - - `s_b_0`: [m] Initial value of absolute position of flange_b + - `flange_a__s`: [m] Initial value of absolute position of flange_a + - `flange_b__s`: [m] Initial value of absolute position of flange_b # Connectors: - `flange_a: 1-dim. translational flange on one side of spring` - `flange_b: 1-dim. translational flange on opposite side of spring` #default function """ -Spring(; name, k, s_a_0 = 0, s_b_0 = 0, l = 0) = Spring(ABS; name, k, s_a_0, s_b_0, l) #default function +function Spring(; name, k, flange_a__s = 0, flange_b__s = 0, l = 0) + Spring(ABS; name, k, flange_a__s, flange_b__s, l) +end #default function -@component function Spring(::Val{:absolute}; name, k, s_a_0 = 0, s_b_0 = 0, l = 0) +@component function Spring(::Val{:absolute}; + name, k, flange_a__s = 0, + flange_b__s = 0, l = 0) pars = @parameters begin k = k - s_a_0 = s_a_0 - s_b_0 = s_b_0 l = l end vars = @variables begin - # delta_s(t) = s1 - s2 - f(t) = k * (s_a_0 - s_b_0 - l) + f(t) = k * (flange_a__s - flange_b__s - l) end - @named flange_a = Flange() - @named flange_b = Flange() + @named flange_a = Flange(; s = flange_a__s, f = k * (flange_a__s - flange_b__s - l)) + @named flange_b = Flange(; s = flange_a__s, f = -k * (flange_a__s - flange_b__s - l)) eqs = [ # delta_s ~ flange_a.s - flange_b.s f ~ k * (flange_a.s - flange_b.s - l) #delta_s flange_a.f ~ +f flange_b.f ~ -f] - return compose(ODESystem(eqs, t, vars, pars; name = name, - defaults = [ - flange_a.s => s_a_0, - flange_b.s => s_b_0, - flange_a.f => k * (s_a_0 - s_b_0 - l), - flange_b.f => -k * (s_a_0 - s_b_0 - l), - ]), flange_a, flange_b) + return compose(ODESystem(eqs, t, vars, pars; name = name), flange_a, flange_b) end """ - Damper(; name, d, v_a_0=0.0, v_b_0=0.0, s_a_0 = 0, s_b_0 = 0) + Damper(; name, d, va =0.0, vb = 0.0, flange_a.s = 0, flange_b.s = 0) Linear 1D translational damper # Parameters: - `d`: [N.s/m] Damping constant - - `s_a_0`: [m] Initial value of absolute position of flange_a - - `s_b_0`: [m] Initial value of absolute position of flange_b - - `v_a_0`: [m/s] Initial value of absolute linear velocity of flange_a - - `v_b_0`: [m/s] Initial value of absolute linear velocity of flange_a + - `flange_a__s`: [m] Initial value of absolute position of flange_a + - `flange_b__s`: [m] Initial value of absolute position of flange_b # Connectors: - `flange_a: 1-dim. translational flange on one side of damper` - `flange_b: 1-dim. translational flange on opposite side of damper` """ -@component function Damper(; name, d, v_a_0 = 0.0, v_b_0 = 0.0, s_a_0 = 0, s_b_0 = 0) - pars = @parameters begin - d = d - s_a_0 = s_a_0 - s_b_0 = s_b_0 - v_a_0 = v_a_0 - v_b_0 = v_b_0 +@mtkmodel Damper begin + @parameters begin + d end - vars = @variables begin - v1(t) = v_a_0 - v2(t) = v_b_0 - f(t) = +(v_a_0 - v_b_0) * d + @variables begin + va(t) = 0.0 + vb(t) = 0.0 + f(t) = +(va - vb) * d end - @named flange_a = Flange() - @named flange_b = Flange() + @components begin + flange_a = Flange(; s = 0.0, f = (va - vb) * d) + flange_b = Flange(; s = 0.0, f = -(va - vb) * d) + end - eqs = [D(flange_a.s) ~ v1 - D(flange_b.s) ~ v2 - f ~ (v1 - v2) * d + @equations begin + D(flange_a.s) ~ va + D(flange_b.s) ~ vb + f ~ (va - vb) * d flange_a.f ~ +f - flange_b.f ~ -f] - return compose(ODESystem(eqs, t, vars, pars; name = name, - defaults = [ - flange_a.s => s_a_0, - flange_b.s => s_b_0, - flange_a.f => +(v_a_0 - v_b_0) * d, - flange_b.f => -(v_a_0 - v_b_0) * d, - ]), flange_a, flange_b) + flange_b.f ~ -f + end end diff --git a/src/Mechanical/TranslationalPosition/sources.jl b/src/Mechanical/TranslationalPosition/sources.jl index 048d7cbf6..67a94a152 100644 --- a/src/Mechanical/TranslationalPosition/sources.jl +++ b/src/Mechanical/TranslationalPosition/sources.jl @@ -1,13 +1,17 @@ """ - Force(;name) + Force(; name) Input signal acting as external force on a flange """ -@component function Force(; name, use_support = false) - @named partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support) - @unpack flange = partial_element - @named f = RealInput() # Accelerating force acting at flange (= -flange.tau) - eqs = [flange.f ~ -f.u] - return extend(ODESystem(eqs, t, [], []; name = name, systems = [f]), - partial_element) +@mtkmodel Force begin + @parameters begin + use_support + end + @extend (flange,) = partial_element = PartialElementaryOneFlangeAndSupport2(use_support = use_support) + @components begin + f = RealInput() # Accelerating force acting at flange (= -flange.tau) + end + @equations begin + flange.f ~ -f.u + end end diff --git a/src/Mechanical/TranslationalPosition/utils.jl b/src/Mechanical/TranslationalPosition/utils.jl index 9f094eb3e..4e3dd86d9 100644 --- a/src/Mechanical/TranslationalPosition/utils.jl +++ b/src/Mechanical/TranslationalPosition/utils.jl @@ -1,9 +1,6 @@ -@connector function Flange(; name) - vars = @variables begin - s(t) - f(t), [connect = Flow] - end - ODESystem(Equation[], t, vars, [], name = name, defaults = Dict(f => 0.0)) +@connector Flange begin + s(t) + f(t), [connect = Flow] end Base.@doc """ Flange(;name) @@ -15,12 +12,9 @@ Base.@doc """ - `f`: [N] Cut force into the flange """ Flange -@connector function Support(; name) - sts = @variables begin - s(t) - f(t), [connect = Flow] - end - ODESystem(Equation[], t, sts, [], name = name, defaults = Dict(s => 0.0, f => 0.0)) +@connector Support begin + s(t) + f(t), [connect = Flow] end Base.@doc """ Support(;name) @@ -37,31 +31,29 @@ Support/housing 1-dim. translational flange. Partial model for the compliant connection of two translational 1-dim. flanges. -# Parameters: - - - `s_rel_start`: [m] Initial relative distance between the flanges - - `f_start`: [N] Initial force between flanges - # States: - - `s_rel`: [m] Relative distance (= flange_b.s - flange_a.s) - - `f`: [N] Force between flanges (= flange_b.f) + - `s_rel`: [m] Relative distance (= flange_b.s - flange_a.s). It accepts an initial value, which defaults to 0.0. + - `f`: [N] Force between flanges (= flange_b.f). It accepts an initial value, which defaults to 0.0. """ -@component function PartialCompliant(; name, s_rel_start = 0.0, f_start = 0.0) - @named flange_a = Flange() - @named flange_b = Flange() - sts = @variables begin - v_a(t) = 0 - v_b(t) = 0 - s_rel(t) = s_rel_start - f(t) = f_start +@mtkmodel PartialCompliant begin#(; name, s_rel_start = 0.0, f_start = 0.0) + @components begin + flange_a = Flange() + flange_b = Flange() + end + @variables begin + v_a(t) = 0.0 + v_b(t) = 0.0 + s_rel(t) = 0.0 + f(t) = 0.0 end - eqs = [D(flange_a.s) ~ v_a + @equations begin + D(flange_a.s) ~ v_a D(flange_b.s) ~ v_b D(s_rel) ~ v_b - v_a flange_b.f ~ +f - flange_a.f ~ -f] - return compose(ODESystem(eqs, t, sts, []; name = name), flange_a, flange_b) + flange_a.f ~ -f + end end """ @@ -83,17 +75,20 @@ Partial model for the compliant connection of two translational 1-dim. flanges. - `a_rel`: [m/s²] Relative linear acceleration (= der(v_rel)) - `f`: [N] Force between flanges (= flange_b.f) """ -@component function PartialCompliantWithRelativeStates(; name, delta_s_0 = 0.0) - @named flange_a = Flange() - @named flange_b = Flange() - sts = @variables begin - delta_s(t) = delta_s_0 - f(t) = 0 +@mtkmodel PartialCompliantWithRelativeStates begin + @components begin + flange_a = Flange() + flange_b = Flange() + end + @variables begin + delta_s(t) = 0.0 + f(t) = 0.0 end - eqs = [delta_s ~ flange_a.s - flange_b.s + @equations begin + delta_s ~ flange_a.s - flange_b.s flange_a.f ~ +f - flange_b.f ~ -f] - return compose(ODESystem(eqs, t, sts, []; name = name), flange_a, flange_b) + flange_b.f ~ -f + end end """ diff --git a/test/Blocks/test_analysis_points.jl b/test/Blocks/test_analysis_points.jl index ccadd22ed..39cc222ef 100644 --- a/test/Blocks/test_analysis_points.jl +++ b/test/Blocks/test_analysis_points.jl @@ -159,7 +159,7 @@ c = 10 # Damping coefficient @named inertia2 = Inertia(; J = m2) @named spring = Spring(; c = k) @named damper = Damper(; d = c) -@named torque = Torque() +@named torque = Torque(; use_support = false) function SystemModel(u = nothing; name = :model) eqs = [connect(torque.flange, inertia1.flange_a) diff --git a/test/Hydraulic/isothermal_compressible.jl b/test/Hydraulic/isothermal_compressible.jl index 3d637fdf8..6ed3afa90 100644 --- a/test/Hydraulic/isothermal_compressible.jl +++ b/test/Hydraulic/isothermal_compressible.jl @@ -217,7 +217,6 @@ end Cd = 0.01 m_piston = 880 - m_body = 1500 end vars = @variables begin @@ -242,10 +241,10 @@ end minimum_volume_b = A_2 * 1e-3, damping_volume_a = A_1 * 5e-3, damping_volume_b = A_2 * 5e-3) - body = T.Mass(; m = m_body) + body = T.Mass(; m = 1500) pipe = IC.Tube(5; p_int = p_2, area = A_2, length = 2.0) snk = IC.FixedPressure(; p = p_r) - pos = T.Position(; s_0 = 0) + pos = T.Position(; s.u_start = 0) m1 = IC.FlowDivider(; p_int = p_2, n = 3) m2 = IC.FlowDivider(; p_int = p_2, n = 3) @@ -318,7 +317,7 @@ end fluid = IC.HydraulicFluid(; let_gas) vol = IC.DynamicVolume(5; p_int = 100e5, area = 0.001, x_int = 0.05, x_max = 0.1, x_damp = 0.02, x_min = 0.01, direction = +1) - mass = T.Mass(; m = 100, g = -9.807, s_0 = 0.05) + mass = T.Mass(; m = 100, g = -9.807, s = 0.05) cap = IC.Cap(; p_int = 100e5) end diff --git a/test/Mechanical/rotational.jl b/test/Mechanical/rotational.jl index 9322ee9d5..79bbbf3ae 100644 --- a/test/Mechanical/rotational.jl +++ b/test/Mechanical/rotational.jl @@ -14,7 +14,7 @@ D = Differential(t) @named inertia1 = Inertia(J = 2) # this one is fixed @named spring = Spring(c = 1e4) @named damper = Damper(d = 10) - @named inertia2 = Inertia(J = 2, phi_start = pi / 2) + @named inertia2 = Inertia(J = 2, phi = pi / 2) connections = [connect(fixed.flange, inertia1.flange_b) connect(inertia1.flange_b, spring.flange_a, damper.flange_a) @@ -63,7 +63,7 @@ end @named fixed = Fixed() @named torque = Torque(use_support = true) - @named inertia1 = Inertia(J = 2, phi_start = pi / 2) + @named inertia1 = Inertia(J = 2, phi = pi / 2) @named spring = Rotational.Spring(c = 1e4) @named damper = Damper(d = 10) @named inertia2 = Inertia(J = 4) @@ -233,7 +233,7 @@ end @named inertia1 = Inertia(J = 2) # this one is fixed @named spring = Spring(c = 1e4) @named damper = Damper(d = 10) - @named inertia2 = Inertia(J = 2, phi_start = pi / 2) + @named inertia2 = Inertia(J = 2, phi = pi / 2) @named speed_sensor = SpeedSensor() @named torque_sensor = TorqueSensor() @named rel_speed_sensor = RelSpeedSensor() diff --git a/test/Mechanical/translational.jl b/test/Mechanical/translational.jl index 60c6dbf66..2cb803843 100644 --- a/test/Mechanical/translational.jl +++ b/test/Mechanical/translational.jl @@ -10,8 +10,8 @@ D = Differential(t) @testset "Free" begin function System(; name) systems = @named begin - acc = TV.Acceleration(false) - a = Constant(k = -10) + acc = TV.Acceleration() + a = Constant(; k = -10) mass = TV.Mass(; m = 100) free = TV.Free() end @@ -32,15 +32,15 @@ D = Differential(t) @test sol[s.free.f][end] ≈ 100 * 10 end -@testset "spring damper mass fixed" begin - @named dv = TV.Damper(d = 1, v_a_0 = 1) - @named dp = TP.Damper(d = 1, v_a_0 = 1, s_a_0 = 3, s_b_0 = 1) +@testset "Spring, Damper, Mass, Fixed" begin + @named dv = TV.Damper(d = 1, flange_a.v = 1) + @named dp = TP.Damper(d = 1, va = 1, vb = 0.0, flange_a.s = 3, flange_b.s = 1) - @named sv = TV.Spring(k = 1, v_a_0 = 1, delta_s_0 = 1) - @named sp = TP.Spring(k = 1, s_a_0 = 3, s_b_0 = 1, l = 1) + @named sv = TV.Spring(k = 1, flange_a__v = 1, delta_s = 1) + @named sp = TP.Spring(k = 1, flange_a__s = 3, flange_b__s = 1, l = 1) - @named bv = TV.Mass(m = 1, v_0 = 1) - @named bp = TP.Mass(m = 1, v_0 = 1, s_0 = 3) + @named bv = TV.Mass(m = 1, v = 1) + @named bp = TP.Mass(m = 1, v = 1, s = 3) @named gv = TV.Fixed() @named gp = TP.Fixed(s_0 = 1) @@ -70,20 +70,20 @@ end end @testset "driven spring damper mass" begin - @named dv = TV.Damper(d = 1, v_a_0 = 1) - @named dp = TP.Damper(d = 1, v_a_0 = 1, s_a_0 = 3, s_b_0 = 1) + @named dv = TV.Damper(d = 1, flange_a.v = 1) + @named dp = TP.Damper(d = 1, va = 1.0, vb = 0.0, flange_a.s = 3, flange_b.s = 1) - @named sv = TV.Spring(k = 1, v_a_0 = 1, delta_s_0 = 1) - @named sp = TP.Spring(k = 1, s_a_0 = 3, s_b_0 = 1, l = 1) + @named sv = TV.Spring(k = 1, flange_a__v = 1, delta_s = 1) + @named sp = TP.Spring(k = 1, flange_a__s = 3, flange_b__s = 1, l = 1) - @named bv = TV.Mass(m = 1, v_0 = 1) - @named bp = TP.Mass(m = 1, v_0 = 1, s_0 = 3) + @named bv = TV.Mass(m = 1, v = 1) + @named bp = TP.Mass(m = 1, v = 1, s = 3) @named gv = TV.Fixed() @named gp = TP.Fixed(s_0 = 1) @named fv = TV.Force() - @named fp = TP.Force() + @named fp = TP.Force(use_support = false) @named source = Sine(frequency = 3, amplitude = 2) @@ -119,8 +119,8 @@ end @testset "sources & sensors" begin function System(; name) systems = @named begin - pos = TV.Position(; s_0 = 0) - pos_sensor = TV.PositionSensor(; s_0 = 1) + pos = TV.Position(; s.u_start = 0) + pos_sensor = TV.PositionSensor(; s = 1) force = TV.Force() force_sensor = TV.ForceSensor() diff --git a/test/Mechanical/translational_modelica.jl b/test/Mechanical/translational_modelica.jl index d17766b3b..015b36572 100644 --- a/test/Mechanical/translational_modelica.jl +++ b/test/Mechanical/translational_modelica.jl @@ -7,12 +7,9 @@ import ModelingToolkitStandardLibrary.Mechanical.TranslationalModelica as TP D = Differential(t) @testset "spring damper mass fixed" begin - @named damper = TP.Damper(1) - - @named spring = TP.Spring(1; s_rel0 = 1) - - @named mass = TP.Mass(1, v0 = 1) - + @named damper = TP.Damper(; d = 1) + @named spring = TP.Spring(; c = 1, s_rel0 = 1) + @named mass = TP.Mass(; m = 1, v = 1) @named fixed = TP.Fixed(s0 = 1) eqs = [connect(spring.flange_a, mass.flange_a, damper.flange_a) @@ -32,16 +29,11 @@ D = Differential(t) end @testset "driven spring damper mass" begin - @named damper = TP.Damper(1) - - @named spring = TP.Spring(1; s_rel0 = 1) - - @named mass = TP.Mass(1, v0 = 1) - - @named fixed = TP.Fixed(s0 = 1) - - @named force = TP.Force() - + @named damper = TP.Damper(; d = 1) + @named spring = TP.Spring(; c = 1, s_rel0 = 1) + @named mass = TP.Mass(; m = 1, v = 1) + @named fixed = TP.Fixed(; s0 = 1) + @named force = TP.Force(use_support = false) @named source = Sine(frequency = 3, amplitude = 2) eqs = [connect(force.f, source.output) diff --git a/test/runtests.jl b/test/runtests.jl index a8f27ab4f..b9ec92c58 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -51,6 +51,9 @@ end @safetestset "Mechanical Translation" begin include("Mechanical/translational.jl") end +@safetestset "Mechanical Translation" begin + include("Mechanical/translational_modelica.jl") +end @safetestset "Multi-Domain" begin include("multi_domain.jl") end