Skip to content

Commit ad26d24

Browse files
authored
Fix bug in untested linearize branch (#227)
* Use nonzero y vel * Relax test
1 parent f3414b9 commit ad26d24

4 files changed

Lines changed: 21 additions & 31 deletions

File tree

src/body_aerodynamics.jl

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,14 +1078,8 @@ function set_va!(body_aero::BodyAerodynamics, va::AbstractVector, omega=zeros(MV
10781078

10791079
# Update wake elements
10801080
frozen_wake!(body_aero, va_distribution)
1081-
if all(iszero, omega)
1082-
body_aero._va .= va
1083-
body_aero.has_distributed_va = false
1084-
else
1085-
body_aero._va .= _compute_reference_velocity_from_distribution(
1086-
va_distribution, n_panels)
1087-
body_aero.has_distributed_va = true
1088-
end
1081+
body_aero._va .= va
1082+
body_aero.has_distributed_va = false
10891083
return nothing
10901084
end
10911085

src/solver.jl

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,8 +1044,9 @@ function linearize(solver::Solver, body_aero::BodyAerodynamics, y::Vector{T};
10441044
throw(ArgumentError("Cannot use theta_idxs or delta_idxs when wing has no unrefined sections"))
10451045
end
10461046

1047-
init_va = body_aero.cache[1][body_aero.va]
1048-
init_va .= body_aero.va
1047+
init_va = body_aero.cache[1][body_aero._va]
1048+
init_va .= body_aero._va
1049+
init_omega = copy(body_aero.omega)
10491050
last_theta_ref = Ref{Vector{T}}(Vector{T}(undef, 0))
10501051
if !isnothing(theta_idxs)
10511052
@views last_theta_ref[] = body_aero.cache[2][y[theta_idxs]]
@@ -1085,15 +1086,10 @@ function linearize(solver::Solver, body_aero::BodyAerodynamics, y::Vector{T};
10851086
end
10861087
end
10871088

1088-
if !isnothing(va_idxs) && isnothing(omega_idxs)
1089-
set_va!(body_aero, y[va_idxs])
1090-
elseif !isnothing(va_idxs) && !isnothing(omega_idxs)
1091-
set_va!(body_aero, y[va_idxs], y[omega_idxs])
1092-
elseif isnothing(va_idxs) && !isnothing(omega_idxs)
1093-
set_va!(body_aero, init_va, y[omega_idxs])
1094-
else
1095-
set_va!(body_aero, init_va)
1096-
end
1089+
va = isnothing(va_idxs) ? init_va : y[va_idxs]
1090+
om = isnothing(omega_idxs) ? init_omega :
1091+
y[omega_idxs]
1092+
set_va!(body_aero, va, om)
10971093

10981094
solve!(solver, body_aero; kwargs...)
10991095
if !aero_coeffs

test/body_aerodynamics/test_body_aerodynamics.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -494,15 +494,15 @@ end
494494
@test panel.va expected_va atol=1e-12
495495
end
496496
@test body_aero.omega omega
497-
@test body_aero.has_distributed_va
498-
@test_throws ArgumentError body_aero.va
497+
@test !body_aero.has_distributed_va
498+
@test body_aero.va va
499499

500500
new_omega = [0.0, 0.0, 2.0]
501-
reference_va = copy(body_aero._va)
501+
@test body_aero._va va
502502
body_aero.omega = new_omega
503503

504504
for panel in body_aero.panels
505-
expected_va = reference_va .+ (-new_omega × panel.control_point)
505+
expected_va = va .+ (-new_omega × panel.control_point)
506506
@test panel.va expected_va atol=1e-12
507507
end
508508
@test body_aero.omega new_omega

test/body_aerodynamics/test_results.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ end
3636

3737
@testset "Nonlinear vs Linear - Comprehensive Input Testing" begin
3838
# Initialize with base parameters
39-
va = [15.0, 0.0, 0.0]
40-
theta = zeros(4)
41-
delta = zeros(4)
42-
omega = zeros(3)
39+
va = [15.0, 1.0, 0.5]
40+
theta = deg2rad.([2.0, 1.0, -1.0, -2.0])
41+
delta = deg2rad.([1.0, 0.5, -0.5, -1.0])
42+
omega = [0.0, 0.1, 0.0]
4343

4444
# Define perturbation magnitudes
4545
dva_magnitudes = [0.01, 0.01, 0.01] # Velocity perturbations (m/s)
@@ -123,7 +123,7 @@ end
123123
reset_va = copy(va)
124124
reset_theta = copy(theta)
125125
reset_delta = copy(delta)
126-
reset_omega = zeros(3)
126+
reset_omega = copy(omega)
127127

128128
# Apply the perturbation to the nonlinear model
129129
if input_name == "va"
@@ -133,7 +133,7 @@ end
133133
elseif input_name == "delta"
134134
reset_delta = delta + perturbation[11:14]
135135
elseif input_name == "omega"
136-
reset_omega = perturbation[8:10]
136+
reset_omega = omega + perturbation[8:10]
137137
else
138138
throw(ArgumentError())
139139
end
@@ -302,8 +302,8 @@ end
302302
@info "$combo_name error metrics" prediction_error baseline_difference error_ratio
303303

304304
# Validate the prediction
305-
@test lin_prediction nonlin_res rtol=0.01 atol=1e-3
306-
@test error_ratio < 0.005
305+
@test lin_prediction nonlin_res rtol=0.05 atol=1e-3
306+
@test error_ratio < 0.05
307307
end
308308
end
309309
end

0 commit comments

Comments
 (0)