Skip to content

Commit 79e91be

Browse files
authored
Merge pull request #202 from SciML/bgc/sources
Source bugs fixed
2 parents c7b207d + 5633908 commit 79e91be

File tree

5 files changed

+46
-21
lines changed

5 files changed

+46
-21
lines changed

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ authors = ["Chris Rackauckas and Julia Computing"]
44
version = "2.1.0"
55

66
[deps]
7+
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
78
IfElse = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173"
89
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
910
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
1011
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
1112

1213
[compat]
14+
DiffEqBase = "6"
1315
IfElse = "0.1"
1416
ModelingToolkit = "8.50"
1517
Symbolics = "4.9, 5"

src/Blocks/sources.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using DiffEqBase
2+
13
# Define and register smooth functions
24
# These are "smooth" aka differentiable and avoid Gibbs effect
35
# These follow: `offset` + `smooth_wave` * `smooth_step` with zero output for `t < start_time`
@@ -626,9 +628,9 @@ function set_sampled_data!(memory::Parameter{T}, t, x, Δt::Parameter{T}) where
626628
n = length(memory.data)
627629
i = round(Int, t / Δt) + 1 #expensive
628630
if i == n + 1
629-
push!(memory.data, x)
631+
push!(memory.data, DiffEqBase.value(x))
630632
elseif i <= n
631-
@inbounds memory.data[i] = x
633+
@inbounds memory.data[i] = DiffEqBase.value(x)
632634
else
633635
error("Memory buffer skipped a step: n=$n, i=$i")
634636
end

src/Mechanical/Translational/sources.jl

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,35 +20,46 @@ Linear 1D force input source
2020
end
2121

2222
"""
23-
Position(; s.u_start = 0.0, name)
23+
Position(solves_force = true; name)
2424
25-
Linear 1D position input source
25+
Linear 1D position input source. Set `solves_force=false` to force input force to 0 (i.e. only the position is given, the respective force needed is already provided elsewhere in the model).
2626
2727
# Connectors:
2828
2929
- `flange`: 1-dim. translational flange
30-
- `s`: real input. `s.u_start` accepts an initial value, which It accepts an initial value, which defaults to 0.0.
30+
- `s`: real input
3131
"""
32-
@component function Position(; solves_force = true, s__u_start = 0, name)
32+
@component function Position(solves_force = true; name)
33+
vars = []
34+
3335
systems = @named begin
34-
flange = MechanicalPort()
36+
flange = MechanicalPort(; v = 0)
3537
s = RealInput()
3638
end
3739

38-
vars = @variables x(t)
39-
40-
eqs = [D(x) ~ flange.v
41-
s.u ~ x]
40+
eqs = [
41+
D(s.u) ~ flange.v,
42+
]
4243

4344
!solves_force && push!(eqs, 0 ~ flange.f)
4445

4546
ODESystem(eqs, t, vars, [];
46-
name, systems, defaults = [flange.v => 0, s.u => s__u_start])
47+
name, systems)
4748
end
4849

49-
@component function Velocity(; solves_force = true, name)
50+
"""
51+
Velocity(solves_force = true; name)
52+
53+
Linear 1D position input source. Set `solves_force=false` to force input force to 0 (i.e. only the velocity is given, the respective force needed is already provided elsewhere in the model).
54+
55+
# Connectors:
56+
57+
- `flange`: 1-dim. translational flange
58+
- `v`: real input
59+
"""
60+
@component function Velocity(solves_force = true; name)
5061
systems = @named begin
51-
flange = MechanicalPort()
62+
flange = MechanicalPort(; v = 0)
5263
v = RealInput()
5364
end
5465

@@ -58,13 +69,23 @@ end
5869

5970
!solves_force && push!(eqs, 0 ~ flange.f)
6071

61-
ODESystem(eqs, t, [], []; name, systems, defaults = [flange.v => 0])
72+
ODESystem(eqs, t, [], []; name, systems)
6273
end
6374

64-
@component function Acceleration(solves_force = true; s__u_start = 0, name)
75+
"""
76+
Acceleration(solves_force = true; name)
77+
78+
Linear 1D position input source. Set `solves_force=false` to force input force to 0 (i.e. only the acceleration is given, the respective force needed is already provided elsewhere in the model).
79+
80+
# Connectors:
81+
82+
- `flange`: 1-dim. translational flange
83+
- `a`: real input
84+
"""
85+
@component function Acceleration(solves_force = true; name)
6586
systems = @named begin
66-
flange = MechanicalPort()
67-
a = RealInput(; u_start = s__u_start)
87+
flange = MechanicalPort(; v = 0)
88+
a = RealInput()
6889
end
6990

7091
vars = @variables v(t) = 0
@@ -74,5 +95,5 @@ end
7495

7596
!solves_force && push!(eqs, 0 ~ flange.f)
7697

77-
ODESystem(eqs, t, vars, []; name, systems, defaults = [flange.v => 0])
98+
ODESystem(eqs, t, vars, []; name, systems)
7899
end

test/Hydraulic/isothermal_compressible.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ end
244244
body = T.Mass(; m = 1500)
245245
pipe = IC.Tube(5; p_int = p_2, area = A_2, length = 2.0)
246246
snk = IC.FixedPressure(; p = p_r)
247-
pos = T.Position(; s.u_start = 0)
247+
pos = T.Position()
248248

249249
m1 = IC.FlowDivider(; p_int = p_2, n = 3)
250250
m2 = IC.FlowDivider(; p_int = p_2, n = 3)

test/Mechanical/translational.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ end
119119
@testset "sources & sensors" begin
120120
function System(; name)
121121
systems = @named begin
122-
pos = TV.Position(; s.u_start = 0)
122+
pos = TV.Position()
123123
pos_sensor = TV.PositionSensor(; s = 1)
124124
force = TV.Force()
125125
force_sensor = TV.ForceSensor()

0 commit comments

Comments
 (0)