Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/faster tether #63

Merged
merged 125 commits into from
Aug 16, 2024
Merged
Changes from 1 commit
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
4a3e354
serialization of initial integrator
1-Bart-1 May 24, 2024
49c43f4
even faster by serializing only once
1-Bart-1 May 24, 2024
2cde0e9
stable data type
1-Bart-1 May 25, 2024
3be8ade
update documentation
1-Bart-1 May 25, 2024
172d521
add check for model
1-Bart-1 May 25, 2024
a4b736f
-a
1-Bart-1 Jun 2, 2024
f2d282d
-a
1-Bart-1 Jun 2, 2024
fc24847
-a
1-Bart-1 Jun 2, 2024
f4ec073
two point aero model
1-Bart-1 Jun 15, 2024
9cbba03
working two point aero model
1-Bart-1 Jun 17, 2024
291620d
xournal notes with formulas
1-Bart-1 Jun 17, 2024
978e5ee
implement new aero model
1-Bart-1 Jun 18, 2024
e200b71
add comment to explain point numbers
1-Bart-1 Jun 18, 2024
349bf14
implement kps4_3l functions
1-Bart-1 Jun 18, 2024
45ac13d
plot lift at different wing positions
1-Bart-1 Jun 18, 2024
7816e4c
add kps4 3 line settings
1-Bart-1 Jun 19, 2024
d583d38
plot
1-Bart-1 Jun 19, 2024
309e49f
bug free init
1-Bart-1 Jun 19, 2024
b1b54b5
implement 3 lines
1-Bart-1 Jun 19, 2024
83ef16c
runs succesfully, not tested
1-Bart-1 Jun 20, 2024
40cdf62
find steady state runs but doesnt diverge
1-Bart-1 Jun 20, 2024
c28e242
converging but not solving steady state
1-Bart-1 Jun 21, 2024
87f5eff
not solving steady state
1-Bart-1 Jun 21, 2024
a147052
notes
1-Bart-1 Jun 21, 2024
e317b3d
updated notes
1-Bart-1 Jun 21, 2024
386e80e
change page order
1-Bart-1 Jun 21, 2024
5899398
change page order
1-Bart-1 Jun 21, 2024
1c747a7
Fix precompilation problem
Jun 21, 2024
70295aa
add file to .gitignore
Jun 21, 2024
5e903c4
different tether length
1-Bart-1 Jun 21, 2024
5ea5db1
Merge branch 'feat/KPS4_3L' of https://github.com/1-Bart-1/KiteModels…
1-Bart-1 Jun 21, 2024
9df8d79
remove Plots from Project
Jun 21, 2024
dca6d12
use package directly
Jun 21, 2024
d9ccffc
correct bridle center distance
1-Bart-1 Jun 21, 2024
9a4fb65
shorter name
1-Bart-1 Jun 21, 2024
809bf71
update bridle center distance
1-Bart-1 Jun 21, 2024
836061d
add kps4_3l settings
1-Bart-1 Jun 21, 2024
b159d69
solve forward slash in branch name
1-Bart-1 Jun 23, 2024
9956a7d
succesful but very slow step
1-Bart-1 Jun 24, 2024
114ea4b
working simulation, just slow
1-Bart-1 Jun 25, 2024
7b35c90
still really slow
1-Bart-1 Jun 25, 2024
c6b9a7b
benchmark test showing big mem alloc
1-Bart-1 Jun 26, 2024
9af56a1
add 3l test
1-Bart-1 Jun 26, 2024
c711e6a
a lot less memory in calc aero forces
1-Bart-1 Jun 26, 2024
bf62cbe
magic memory alloc
1-Bart-1 Jun 26, 2024
f7f578b
remove a lot of heap alloc
1-Bart-1 Jun 26, 2024
d3aa0de
working but slow
1-Bart-1 Jun 26, 2024
d72ea0f
a lot less allocations
1-Bart-1 Jun 27, 2024
2075f31
zero heap alloc in calc_aero_forces
1-Bart-1 Jun 27, 2024
ca3f3dd
no heap alloc
1-Bart-1 Jun 27, 2024
6264b36
working no heap alloc version
1-Bart-1 Jun 27, 2024
bd18f07
fix E distance
1-Bart-1 Jun 28, 2024
d827323
flying makes sense and is fast
1-Bart-1 Jun 29, 2024
28cd1a6
add kps4_3l to precompile workload
1-Bart-1 Jul 1, 2024
75d4a4e
add orient calc func
1-Bart-1 Jul 1, 2024
8acb650
export function
1-Bart-1 Jul 1, 2024
ace0dbc
remove unnecesary print
1-Bart-1 Jul 2, 2024
d9bb1c9
remove controlplots dependency
1-Bart-1 Jul 2, 2024
ba8f904
remove unused import
1-Bart-1 Jul 3, 2024
6614de7
remove unnecesary imports
1-Bart-1 Jul 3, 2024
9d8f903
calc azimuth elevation
1-Bart-1 Jul 4, 2024
48b60f6
need to test int history
1-Bart-1 Jul 14, 2024
1745251
fix keyword error
1-Bart-1 Jul 26, 2024
d1c7422
remove precompiling for 3 and 4
1-Bart-1 Jul 26, 2024
63c5464
Merge branch 'main' into feat/KPS4_3L
1-Bart-1 Jul 26, 2024
29fccd6
fix issues after merge
1-Bart-1 Jul 26, 2024
7d2cbf8
fix benchmark mem alloc
1-Bart-1 Jul 26, 2024
6117404
add test cases for 3 line model
1-Bart-1 Jul 27, 2024
bbeab45
one 4p model test failing
1-Bart-1 Jul 27, 2024
7934afa
succesful tests
1-Bart-1 Jul 27, 2024
5b03006
Merge pull request #1 from 1-Bart-1/feat/KPS4_3L
1-Bart-1 Jul 27, 2024
72583a3
Merge branch 'main' into main
1-Bart-1 Jul 27, 2024
9001541
fix precompile
1-Bart-1 Jul 27, 2024
93f0307
Merge branch 'feat/KPS4_3L'
1-Bart-1 Jul 27, 2024
9857781
no errors
1-Bart-1 Aug 1, 2024
2923588
generate odesystem
1-Bart-1 Aug 2, 2024
b977413
unbalanced system
1-Bart-1 Aug 2, 2024
0a50c66
succesful simple system
1-Bart-1 Aug 2, 2024
a0c95c0
add steering connections
1-Bart-1 Aug 2, 2024
e27f8e9
Merge branch 'feat/faster-tether' of https://github.com/1-Bart-1/Kite…
1-Bart-1 Aug 2, 2024
90662f5
succesful steps
1-Bart-1 Aug 2, 2024
f47e2e8
add pos
1-Bart-1 Aug 2, 2024
1a6e192
non-zero force
1-Bart-1 Aug 3, 2024
74983da
good tether forces
1-Bart-1 Aug 4, 2024
9bfaf09
find steady state
1-Bart-1 Aug 5, 2024
9d54c78
working kps4_3l_test
1-Bart-1 Aug 5, 2024
1b07dc3
working winches
1-Bart-1 Aug 5, 2024
15d9091
700 times realtime
1-Bart-1 Aug 5, 2024
9b49b5f
really fast pos update
1-Bart-1 Aug 5, 2024
f8c1cd1
old version
1-Bart-1 Aug 6, 2024
37fe893
add benchmark
1-Bart-1 Aug 6, 2024
a3458ff
reset kite
1-Bart-1 Aug 6, 2024
0ff0390
add kite vel
1-Bart-1 Aug 6, 2024
025d010
add reel out speeds
1-Bart-1 Aug 6, 2024
61aa11a
fast and neat state updates
1-Bart-1 Aug 7, 2024
2453ddd
very fast reset
1-Bart-1 Aug 7, 2024
b9211ca
remove reset arg
1-Bart-1 Aug 7, 2024
8bf3b76
small fix
1-Bart-1 Aug 7, 2024
eca7acf
remove prints and controlplots
1-Bart-1 Aug 7, 2024
58b79bf
assert right steering pos
1-Bart-1 Aug 8, 2024
3478f9c
downgrade to stable version
1-Bart-1 Aug 8, 2024
553f44f
start kite at segment num_E
1-Bart-1 Aug 8, 2024
4ded2f4
add point E to kite
1-Bart-1 Aug 8, 2024
69ef5cc
move tether force to point A
1-Bart-1 Aug 8, 2024
cb76476
Merge branch 'main' into main
ufechner7 Aug 8, 2024
8b07815
move forces back to c and d and increase steering force
1-Bart-1 Aug 9, 2024
f97fd35
remove brake
1-Bart-1 Aug 9, 2024
5c62cf5
Merge branch 'main' into main
ufechner7 Aug 9, 2024
92ec28c
fix typo
1-Bart-1 Aug 9, 2024
d676354
Merge branch 'main' of https://github.com/1-Bart-1/KiteModels.jl
1-Bart-1 Aug 9, 2024
0d4511f
reduce steering damping
1-Bart-1 Aug 15, 2024
b9bf8c5
remove controlplots
1-Bart-1 Aug 15, 2024
7f3009a
change to faster solver
1-Bart-1 Aug 15, 2024
f31d416
Merge branch 'main' into feat/faster-tether
1-Bart-1 Aug 15, 2024
7d3530e
longer episode
1-Bart-1 Aug 15, 2024
d89bbd9
Merge branch 'main' into feat/faster-tether
1-Bart-1 Aug 16, 2024
43af722
move functions to the right place
1-Bart-1 Aug 16, 2024
253c9e1
merge updated main and add examples
1-Bart-1 Aug 16, 2024
7bc841a
remove unused file
1-Bart-1 Aug 16, 2024
3186ffc
update tolerances
1-Bart-1 Aug 16, 2024
e611b76
change integrator name
1-Bart-1 Aug 16, 2024
0355f50
fix tests
1-Bart-1 Aug 16, 2024
0a746ee
remove testenv
1-Bart-1 Aug 16, 2024
ba1f4c7
remove xopp file
1-Bart-1 Aug 16, 2024
a2c696b
remove double import
1-Bart-1 Aug 16, 2024
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
Prev Previous commit
Next Next commit
good tether forces
1-Bart-1 committed Aug 4, 2024
commit 74983da8d487d9f9135694e5c94e1eaced898cf8
30 changes: 23 additions & 7 deletions src/KPS4_3L.jl
Original file line number Diff line number Diff line change
@@ -184,6 +184,8 @@ $(TYPEDFIELDS)
model_force = nothing
model_y_lc = nothing

half_drag_force::SVector{P, T} = zeros(SVector{P, T})

"residual variables"
num_A::Int64 = 0
L_C::T = zeros(S, 3)
@@ -347,9 +349,6 @@ function calc_aero_forces!(s::KPS4_3L, pos::SVector{N, KVec3}, vel::SVector{N, K
d = (s.δ_right - s.δ_left) / (s.α_r - s.α_l) * (α - s.α_l) + (s.δ_left)
end
aoa = π - acos2(normalize(s.v_a_xr) ⋅ s.e_x) + asin(clamp(d/kite_length, -1.0, 1.0))
# println("aoa ", aoa)
# println("asin ", asin(clamp(d/kite_length, -1.0, 1.0)))
# println("acos ", pi - acos2(normalize(s.v_a_xr) ⋅ s.e_x))
s.dL_dα .= 0.5*s.rho*(norm(s.v_a_xr))^2*s.set.radius*kite_length*rad_cl(aoa) .* normalize(s.v_a_xr × s.e_drift)
s.dD_dα .= 0.5*s.rho*norm(s.v_a_xr)*s.set.radius*kite_length*rad_cd(aoa) .* s.v_a_xr # the sideways drag cannot be calculated with the C_d formula
if i <= n
@@ -369,6 +368,11 @@ function calc_aero_forces!(s::KPS4_3L, pos::SVector{N, KVec3}, vel::SVector{N, K
s.forces[s.num_D] .+= (s.L_D .+ s.D_D) .- s.F_steering_d
s.forces[s.num_E-2] .+= s.F_steering_c
s.forces[s.num_E-1] .+= s.F_steering_d
println("lift forces ")
println("s.forces[s.num_C] ", s.forces[s.num_C])
println("s.L_C ", s.L_C)
println("s.dL_dα ", s.dL_dα)
println("s.dα ", dα)
return nothing
end

@@ -410,6 +414,18 @@ The result is stored in the array s.forces.

v_app_perp = s.v_apparent - s.v_apparent ⋅ unit_vector * unit_vector
half_drag_force = (0.25 * rho * s.set.cd_tether * norm(v_app_perp) * area) * v_app_perp

# if i == s.num_C
# println("spring forces ", i)
# println("spring_force ", s.spring_force)
# println("k ", k)
# println("C ", c)
# println("k1 ", k1)
# println("k2 ", k2)
# println("c1 ", c1)
# println("l_0 ", l_0)
# println("spring_vel ", spring_vel)
# end

@inbounds s.forces[spring.p1] .+= half_drag_force + s.spring_force
@inbounds s.forces[spring.p2] .+= half_drag_force - s.spring_force
@@ -447,7 +463,7 @@ Calculate the vectors s.res1 and calculate s.res2 using loops
that iterate over all tether segments.
"""
function loop!(s::KPS4_3L, pos, vel, posd, veld)
L_0 = s.l_tethers[1] / s.set.segments
L_0 = s.l_tethers / s.set.segments

mass_per_meter = s.set.rho_tether * π * (s.set.d_tether/2000.0)^2

@@ -457,11 +473,11 @@ function loop!(s::KPS4_3L, pos, vel, posd, veld)
# Compute the masses and forces
mass_tether_particle = mass_per_meter * s.segment_lengths[1]
# TODO: check if the next two lines are correct
damping = s.set.damping / L_0
c_spring = s.set.c_spring / L_0
damping = s.set.damping ./ L_0
c_spring = s.set.c_spring ./ L_0
for i in 1:s.set.segments*3
@inbounds s.masses[i] = mass_tether_particle
@inbounds s.springs[i] = SP(s.springs[i].p1, s.springs[i].p2, s.segment_lengths[i%3+1], c_spring, damping)
@inbounds s.springs[i] = SP(s.springs[i].p1, s.springs[i].p2, s.segment_lengths[i%3+1], c_spring[i%3+1], damping[i%3+1])
end
inner_loop!(s, pos, vel, s.v_wind_gnd, s.set.d_tether/1000.0)
for i in s.num_E-2:s.num_E-1
31 changes: 17 additions & 14 deletions src/KPS4_3L_model.jl
Original file line number Diff line number Diff line change
@@ -157,9 +157,9 @@ function calc_aero_forces_model!(s::KPS4_3L, eqs2, force_eqs, force, pos, vel, t
d_d_eq
F_steering_c ~ ((0.1 * (L_C ⋅ -e_z)) .* -e_z)
F_steering_d ~ ((0.1 * (L_D ⋅ -e_z)) .* -e_z)
]
]

force_eqs[:,s.num_C] .= (force[:,s.num_C] .~ (L_C + D_C) .- F_steering_c)
force_eqs[:,s.num_C] .= (force[:,s.num_C] .~ (L_C .+ D_C) .- F_steering_c)
force_eqs[:,s.num_D] .= (force[:,s.num_D] .~ (L_D .+ D_D) .- F_steering_d)
force_eqs[:,s.num_E-2] .= (force[:,s.num_E-2] .~ F_steering_c)
force_eqs[:,s.num_E-1] .= (force[:,s.num_E-1] .~ F_steering_d)
@@ -175,7 +175,7 @@ The result is stored in the array s.forces.
"""
@inline function calc_particle_forces_model!(s::KPS4_3L, eqs2, force_eqs, force, pos1, pos2, vel1, vel2, length, c_spring, damping, rho, i,
l_0, k, c, segment, rel_vel, av_vel, norm1, unit_vector, k1, k2, c1, spring_vel,
spring_force, v_apparent, area, v_app_perp, half_drag_force)
spring_force, v_apparent, v_wind_tether, area, v_app_perp, half_drag_force)
d_tether = s.set.d_tether/1000.0
eqs2 = [
eqs2
@@ -218,9 +218,9 @@ The result is stored in the array s.forces.
end
eqs2 = [
eqs2
v_apparent .~ s.v_wind_tether .- av_vel
v_apparent .~ v_wind_tether .- av_vel
area ~ norm1 * d_tether
v_app_perp ~ s.v_apparent .- s.v_apparent ⋅ unit_vector * unit_vector
v_app_perp ~ v_apparent .- v_apparent ⋅ unit_vector * unit_vector
half_drag_force .~ (0.25 * rho * s.set.cd_tether * norm(v_app_perp) * area) .* v_app_perp
]

@@ -288,11 +288,12 @@ Output:length
rho[i] ~ calc_rho(s.am, height[i])
v_wind_tether[:,i] .~ calc_wind_factor(s.am, height[i]) .* s.v_wind_gnd
]

# TODO: @assert height > 0
eqs2, force_eqs = calc_particle_forces_model!(s, eqs2, force_eqs, force, pos[:,p1], pos[:,p2], vel[:,p1], vel[:,p2], length, c_spring, damping, rho[i], i,
l_0[i], k[i], c[i], segment[:,i], rel_vel[:,i], av_vel[:,i], norm1[i],
unit_vector[:,i], k1[i], k2[i], c1[i], spring_vel[i],
spring_force[:,i], v_apparent[:,i], area[i], v_app_perp[:,i], half_drag_force[:,i])
spring_force[:,i], v_apparent[:,i], v_wind_tether[:,i], area[i], v_app_perp[:,i], half_drag_force[:,i])
end

return eqs2, force_eqs
@@ -335,7 +336,7 @@ function model!(s::KPS4_3L, pos_, vel_)
e_x(t)[1:3] = s.e_x
e_y(t)[1:3] = s.e_y
e_z(t)[1:3] = s.e_z
force(t)[1:3, 1:s.num_A] = force_
force(t)[1:3, 1:s.num_A] = zeros(3, s.num_A)
end
# Collect the arrays into variables
pos = collect(pos)
@@ -411,7 +412,6 @@ function model!(s::KPS4_3L, pos_, vel_)
damping .~ s.set.damping ./ segment_lengths
c_spring .~ s.set.c_spring ./ segment_lengths
P_c ~ 0.5 .* (pos[:,s.num_C]+pos[:,s.num_D])
# e_y .~ norm(P_c)
e_y .~ (pos[:,s.num_C] .- pos[:,s.num_D]) ./ norm(pos[:,s.num_C] .- pos[:,s.num_D])
e_z .~ (pos[:,s.num_E] .- P_c) ./ norm(pos[:,s.num_E] .- P_c)
e_x .~ cross(e_y, e_z)
@@ -421,24 +421,27 @@ function model!(s::KPS4_3L, pos_, vel_)
eqs2, force_eqs = inner_loop_model!(s, eqs2, force_eqs, t, force, pos, vel, segment_lengths, c_spring, damping)

for i in 1:3
eqs2 = vcat(eqs2, vcat(force_eqs[:,i]))
eqs2 = vcat(eqs2, acc[:,i] .~ 0)
end
for i in 4:s.num_E-3
eqs2 = vcat(eqs2, vcat(force_eqs[:,i]))
eqs2 = vcat(eqs2, acc[:,i] .~ (force[:,i] ./ mass_tether_particle[i%3+1]))
eqs2 = vcat(eqs2, acc[:,i] .~ [0.0; 0.0; -9.81] .+ (force[:,i] ./ mass_tether_particle[i%3+1]))
end
for i in s.num_E-2:s.num_E-1
[force_eqs[j,i] = force[j,i] ~ force_eqs[j,i].rhs + [0, 0, -G_EARTH][j] + 500.0 * ((vel[:,i]-vel[:,s.num_C]) ⋅ e_z) * e_z[j] for j in 1:3] # TODO: more damping
[force_eqs[j,i] = force[j,i] ~ force_eqs[j,i].rhs - s.forces[i][j] - (s.forces[i] ⋅ e_z) * e_z[j] for j in 1:3]
[force_eqs[j,i+3] = force[j,i+3] ~ force_eqs[j,i].rhs + s.forces[i][j] - (s.forces[i] ⋅ e_z) * e_z[j] for j in 1:3]
[force_eqs[j,i] = force[j,i] ~ force_eqs[j,i].rhs + [0.0; 0.0; -9.81][j] + 500.0 * ((vel[:,i]-vel[:,s.num_C]) ⋅ e_z) * e_z[j] for j in 1:3] # TODO: more damping
[force_eqs[j,i] = force[j,i] ~ force_eqs[j,i].rhs - (s.forces[i][j] - (s.forces[i] ⋅ e_z) * e_z[j]) for j in 1:3]
[force_eqs[j,i+3] = force[j,i+3] ~ force_eqs[j,i+3].rhs + (s.forces[i][j] - (s.forces[i] ⋅ e_z) * e_z[j]) for j in 1:3]
eqs2 = vcat(eqs2, vcat(force_eqs[:,i]))
eqs2 = vcat(eqs2, steering_acc[i-s.num_E+3] ~ (force[:,i] ./ mass_tether_particle[i%3+1]) ⋅ e_z - (acc[:,i+3] ⋅ s.e_z))
eqs2 = vcat(eqs2, steering_acc[i-s.num_E+3] ~ (force[:,i] ./ mass_tether_particle[i%3+1]) ⋅ e_z - (acc[:,i+3] ⋅ e_z))
end
for i in s.num_E:s.num_A
eqs2 = vcat(eqs2, vcat(force_eqs[:,i]))
eqs2 = vcat(eqs2, acc[:,i] .~ (force[:,i] ./ s.masses[i]))
eqs2 = vcat(eqs2, acc[:,i] .~ [0.0; 0.0; -9.81] .+ (force[:,i] ./ s.masses[i]))
end

println("force_eqs s.num_C ", force_eqs[:, s.num_C])

eqs = vcat(eqs1, eqs2)

# @assert false
2 changes: 1 addition & 1 deletion src/init.jl
Original file line number Diff line number Diff line change
@@ -211,7 +211,7 @@ function init_pos_vel_acc(s::KPS4_3L, X=zeros(5*s.set.segments+3); delta = 0.0)
# set vel and acc
for i in 1:s.num_A
vel[i] .= [delta, delta, delta]
acc[i] .= [delta, delta, -9.81]
acc[i] .= [delta, delta, delta]
end

for i in eachindex(pos)
26 changes: 16 additions & 10 deletions test/kps4_3l_model.jl
Original file line number Diff line number Diff line change
@@ -13,20 +13,26 @@ using Revise, KiteModels, OrdinaryDiffEq, ControlPlots
s = KPS4_3L(KCU(se()))
dt = 0.0001
integrator, simple_sys = KiteModels.init_sim!(s; stiffness_factor=0.3, prn=true, mtk=true)
# simple_sys, sys = model!(s, s.pos, s.vel)
for i in 1:10
println("stepping...")
@time next_step!(s, integrator)
plot2d(s.pos, 10; zoom=false, front=false, segments=se().segments)
for (p, v, a) in zip(s.pos, s.vel, s.acc)
println("p $p v $v a $a ")
end
sleep(1)
end
# # simple_sys, sys = model!(s, s.pos, s.vel)
# for i in 1:3
# println("stepping...")
# @time next_step!(s, integrator)
# plot2d(s.pos, 10; zoom=false, front=false, segments=se().segments)
# for (p, v, a) in zip(s.pos, s.vel, s.acc)
# println("p $p v $v a $a ")
# end
# sleep(1)
# end

"""
debugging:
integrator.sol(0.000000001; idxs=simple_sys.F_steering_c)

lift forces
s.forces[s.num_C] [90.77840952796961, 165.41850136730986, 342.11333043413924]
s.L_C [-8.497202522311054e-16, 155.80076139240956, 383.6297003775512]
s.dL_dα [-9.08473977288504e-16, -100.70528355285708, 608.742755393975]
s.dα 0.3416666666666666
"""

nothing