Skip to content

Commit fd6e575

Browse files
committed
add omega
1 parent d2b832a commit fd6e575

File tree

3 files changed

+28
-32
lines changed

3 files changed

+28
-32
lines changed

examples/rectangular_wing.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ wa = BodyAerodynamics([wing])
3131

3232
# Set inflow conditions
3333
vel_app = [cos(alpha), 0.0, sin(alpha)] .* v_a
34-
set_va!(wa, (vel_app, 0.0)) # Second parameter is yaw rate
34+
set_va!(wa, vel_app, [0, 0, 0.1])
3535

3636
# Step 4: Initialize solvers for both LLT and VSM methods
3737
llt_solver = Solver(aerodynamic_model_type=:LLT)

src/body_aerodynamics.jl

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ Main structure for calculating aerodynamic properties of bodies.
66
# Fields
77
- panels::Vector{Panel}: Vector of Panel structs
88
- wings::Vector{AbstractWing}: a vector of wings; a body can have multiple wings
9-
- `_va`::Union{Nothing, Vector{Float64}, Tuple{MVec3, Float64}}: A vector of the apparent wind speed,
10-
or a tuple of the v_a vector and yaw rate (rad/s).
9+
- `va`::Union{Nothing, MVec3}: A vector of the apparent wind speed
10+
- `omega`::Union{Nothing, MVec3}: A vector of the turn rate around the kite body axes
1111
- `gamma_distribution`::Union{Nothing, Vector{Float64}}: unclear, please defined
1212
- `alpha_uncorrected`::Union{Nothing, Vector{Float64}}: unclear, please define
1313
- `alpha_corrected`::Union{Nothing, Vector{Float64}}: unclear, please define
@@ -16,7 +16,8 @@ Main structure for calculating aerodynamic properties of bodies.
1616
mutable struct BodyAerodynamics
1717
panels::Vector{Panel}
1818
wings::Vector{AbstractWing} # can be a vector of Wings, or of KiteWings
19-
_va::Union{Nothing, Vector{Float64}, Tuple{MVec3, Float64}}
19+
_va::Union{Nothing, Vector{Float64}}
20+
omega::Union{Nothing, MVec3}
2021
gamma_distribution::Union{Nothing, Vector{Float64}}
2122
alpha_uncorrected::Union{Nothing, Vector{Float64}}
2223
alpha_corrected::Union{Nothing, Vector{Float64}}
@@ -75,6 +76,7 @@ mutable struct BodyAerodynamics
7576
panels,
7677
wings,
7778
nothing, # va
79+
nothing, # omega
7880
nothing, # gamma_distribution
7981
nothing, # alpha_uncorrected
8082
nothing, # alpha_corrected
@@ -95,8 +97,8 @@ function Base.getproperty(obj::BodyAerodynamics, sym::Symbol)
9597
end
9698

9799
function Base.setproperty!(obj::BodyAerodynamics, sym::Symbol, val)
98-
if sym === :va
99-
set_va!(obj, val)
100+
if sym === :va || sym === :omega
101+
@error "Use set_va! to set the apparent velocity."
100102
else
101103
setfield!(obj, sym, val)
102104
end
@@ -607,49 +609,43 @@ end
607609

608610

609611
"""
610-
set_va!(body_aero::BodyAerodynamics, va::Union{Vector{Float64}, Tuple{Vector{Float64}, Float64}})
612+
set_va!(body_aero::BodyAerodynamics, va, omega=zeros(3))
611613
612614
Set velocity array and update wake filaments.
613615
614616
# Arguments
615-
- `va`: Either a velocity vector or tuple of (velocity vector, yaw_rate)
617+
- `va`: Either a velocity vector or a list of velocity vectors
618+
- `omega`: Turn rate around x y and z axis
616619
"""
617-
function set_va!(body_aero::BodyAerodynamics, va)
618-
# Add length check for va_vec
620+
function set_va!(body_aero::BodyAerodynamics, va, omega=zeros(MVec3))
621+
omega = MVec3(omega)
622+
623+
# Add length check for va
619624
if va isa Vector{Float64} && length(va) != 3 && length(va) != length(body_aero.panels)
620625
throw(ArgumentError("va must be length 3 or match number of panels"))
621626
end
622-
# Handle input types
623-
va_vec, yaw_rate = if va isa Tuple && length(va) == 2
624-
va
625-
else
626-
(va, 0.0)
627-
end
628-
629-
# Validate input
630-
va_vec = convert(Vector{Float64}, va_vec)
631627

632628
# Calculate va_distribution based on input type
633-
va_distribution = if length(va_vec) == 3 && yaw_rate == 0.0
634-
repeat(reshape(va_vec, 1, 3), length(body_aero.panels))
635-
elseif length(va_vec) == length(body_aero.panels)
636-
va_vec
637-
elseif yaw_rate != 0.0 && length(va_vec) == 3
638-
va_dist = Vector{Float64}[]
629+
va_distribution = if length(va) == 3 && all(omega .== 0.0)
630+
repeat(reshape(va, 1, 3), length(body_aero.panels))
631+
elseif length(va) == length(body_aero.panels)
632+
va
633+
elseif !all(omega .== 0.0) && length(va) == 3
634+
va_dist = zeros(length(body_aero.panels), 3)
639635

640636
for wing in body_aero.wings
641637
# Get spanwise positions
642-
spanwise_positions = [panel.control_point[2] for panel in body_aero.panels]
638+
spanwise_positions = [panel.control_point for panel in body_aero.panels]
643639

644640
# Calculate velocities for each panel
645641
for i in 1:wing.n_panels
646-
yaw_rate_apparent_velocity = [-yaw_rate * spanwise_positions[i], 0.0, 0.0]
647-
push!(va_dist, yaw_rate_apparent_velocity + va_vec)
642+
omega_va = -omega × spanwise_positions[i]
643+
va_dist[i, :] .= omega_va .+ va
648644
end
649645
end
650-
reduce(vcat, va_dist)
646+
va_dist
651647
else
652-
throw(ArgumentError("Invalid va distribution: length(va)=$(length(va_vec)) ≠ n_panels=$(length(body_aero.panels))"))
648+
throw(ArgumentError("Invalid va distribution: length(va)=$(length(va)) ≠ n_panels=$(length(body_aero.panels))"))
653649
end
654650

655651
# Update panel velocities
@@ -659,5 +655,6 @@ function set_va!(body_aero::BodyAerodynamics, va)
659655

660656
# Update wake elements
661657
body_aero.panels = frozen_wake(va_distribution, body_aero.panels)
662-
body_aero._va = va_vec
658+
body_aero._va = va
659+
return nothing
663660
end

src/plotting.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,6 @@ function plot_polars(
639639
# Read all data first
640640
data = readdlm(path, ',')
641641
# Skip the header row by taking data from row 2 onwards
642-
@show data[1, :]
643642
data = data[2:end, :]
644643
push!(polar_data_list, [data[:, 3], data[:, 1], data[:, 2], zeros(length(data[:, 1]))])
645644
end

0 commit comments

Comments
 (0)