@@ -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,7 +97,7 @@ function Base.getproperty(obj::BodyAerodynamics, sym::Symbol)
9597end
9698
9799function Base. setproperty! (obj:: BodyAerodynamics , sym:: Symbol , val)
98- if sym === :va
100+ if sym === :va || sym === :omega
99101 set_va! (obj, val)
100102 else
101103 setfield! (obj, sym, val)
@@ -639,49 +641,43 @@ end
639641
640642
641643"""
642- set_va!(body_aero::BodyAerodynamics, va::Union{Vector{Float64}, Tuple{Vector{Float64}, Float64}} )
644+ set_va!(body_aero::BodyAerodynamics, va, omega=zeros(3) )
643645
644646Set velocity array and update wake filaments.
645647
646648# Arguments
647- - `va`: Either a velocity vector or tuple of (velocity vector, yaw_rate)
649+ - `va`: Either a velocity vector or a list of velocity vectors
650+ - `omega`: Turn rate around x y and z axis
648651"""
649- function set_va! (body_aero:: BodyAerodynamics , va)
650- # Add length check for va_vec
652+ function set_va! (body_aero:: BodyAerodynamics , va, omega= zeros (MVec3))
653+ omega = MVec3 (omega)
654+
655+ # Add length check for va
651656 if va isa Vector{Float64} && length (va) != 3 && length (va) != length (body_aero. panels)
652657 throw (ArgumentError (" va must be length 3 or match number of panels" ))
653658 end
654- # Handle input types
655- va_vec, yaw_rate = if va isa Tuple && length (va) == 2
656- va
657- else
658- (va, 0.0 )
659- end
660-
661- # Validate input
662- va_vec = convert (Vector{Float64}, va_vec)
663659
664660 # Calculate va_distribution based on input type
665- va_distribution = if length (va_vec ) == 3 && yaw_rate == 0.0
666- repeat (reshape (va_vec , 1 , 3 ), length (body_aero. panels))
667- elseif length (va_vec ) == length (body_aero. panels)
668- va_vec
669- elseif yaw_rate != 0.0 && length (va_vec ) == 3
670- va_dist = Vector{Float64}[]
661+ va_distribution = if length (va ) == 3 && all (omega . == 0.0 )
662+ repeat (reshape (va , 1 , 3 ), length (body_aero. panels))
663+ elseif length (va ) == length (body_aero. panels)
664+ va
665+ elseif ! all (omega .== 0.0 ) && length (va ) == 3
666+ va_dist = zeros ( length (body_aero . panels), 3 )
671667
672668 for wing in body_aero. wings
673669 # Get spanwise positions
674- spanwise_positions = [panel. control_point[ 2 ] for panel in body_aero. panels]
670+ spanwise_positions = [panel. control_point for panel in body_aero. panels]
675671
676672 # Calculate velocities for each panel
677673 for i in 1 : wing. n_panels
678- yaw_rate_apparent_velocity = [ - yaw_rate * spanwise_positions[i], 0.0 , 0.0 ]
679- push! ( va_dist, yaw_rate_apparent_velocity + va_vec)
674+ omega_va = - omega × spanwise_positions[i]
675+ va_dist[i, :] . = omega_va .+ va
680676 end
681677 end
682- reduce (vcat, va_dist)
678+ va_dist
683679 else
684- throw (ArgumentError (" Invalid va distribution: length(va)=$(length (va_vec )) ≠ n_panels=$(length (body_aero. panels)) " ))
680+ throw (ArgumentError (" Invalid va distribution: length(va)=$(length (va )) ≠ n_panels=$(length (body_aero. panels)) " ))
685681 end
686682
687683 # Update panel velocities
@@ -691,5 +687,6 @@ function set_va!(body_aero::BodyAerodynamics, va)
691687
692688 # Update wake elements
693689 body_aero. panels = frozen_wake (va_distribution, body_aero. panels)
694- body_aero. _va = va_vec
690+ body_aero. _va = va
691+ return nothing
695692end
0 commit comments