@@ -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.
1616mutable 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)
9597end
9698
9799function 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
612614Set 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
663660end
0 commit comments