@@ -113,140 +113,6 @@ include("utils.jl")
113113end
114114
115115
116- @testset " Calculate results against output results" begin
117- # Setup
118- density = 1.225
119- N = 40
120- max_chord = 1.0
121- span = 15.709 # AR = 20
122- v_a = 20.0
123- AR = span^ 2 / (π * span * max_chord / 4 )
124- aoa = deg2rad (5 )
125- v_a = [cos (aoa), 0.0 , sin (aoa)] .* v_a
126- model = VSM
127-
128- # Setup wing geometry
129- dist = " cos"
130- core_radius_fraction = 1e-20
131- coord = generate_coordinates_el_wing (max_chord, span, N, dist)
132- coord_left_to_right = flip_created_coord_in_pairs (deepcopy (coord))
133- wing = Wing (N; spanwise_distribution= UNCHANGED)
134- for idx in 1 : 2 : length (coord_left_to_right[:, 1 ])
135- @debug " coord_left_to_right[$idx ] = $(coord_left_to_right[idx,:]) "
136- add_section! (
137- wing,
138- coord_left_to_right[idx,:],
139- coord_left_to_right[idx+ 1 ,:],
140- INVISCID
141- )
142- end
143-
144- body_aero = BodyAerodynamics ([wing])
145- set_va! (body_aero, v_a)
146-
147- # Run analysis
148- P = length (body_aero. panels)
149- loop_solver = Solver {P} (
150- aerodynamic_model_type= model,
151- core_radius_fraction= core_radius_fraction,
152- solver_type= LOOP,
153- atol= 1e-8 ,
154- rtol= 1e-8
155- )
156- nonlin_solver = Solver {P} (
157- aerodynamic_model_type= model,
158- core_radius_fraction= core_radius_fraction,
159- solver_type= NONLIN,
160- atol= 1e-8 ,
161- rtol= 1e-8
162- )
163- results_NEW = solve (loop_solver, body_aero; reference_point= [0 ,1 ,0 ])
164- # println(results_NEW)
165-
166- @test results_NEW isa Dict
167-
168- @testset " Loop and nonlin solve!" begin
169- loop_sol = solve! (loop_solver, body_aero; reference_point= [0 ,1 ,0 ])
170- nonlin_sol = solve! (nonlin_solver, body_aero; reference_point= [0 ,1 ,0 ])
171-
172- @test all (isapprox .(nonlin_sol. gamma_distribution, loop_sol. gamma_distribution; atol= 1e-4 ))
173-
174- @test loop_sol. force. x ≈ - 117.96518414816444 atol= 1e-4
175- @test loop_sol. force. y ≈ 0.0 atol= 1e-10
176- @test loop_sol. force. z ≈ 1481.996390329679 atol= 1e-4 rtol= 1e-4
177-
178- @test loop_sol. moment. x ≈ - 1481.996390329678 atol= 1e-4 rtol= 1e-4
179- @test loop_sol. moment. y ≈ 0.0 atol= 1e-10
180- @test loop_sol. moment. z ≈ - 117.9651841481644 atol= 1e-4
181-
182- @test loop_sol. force_coefficients[1 ] ≈ - 0.039050322560956294 atol= 1e-4 # CFx
183- @test loop_sol. force_coefficients[2 ] ≈ 0.0 atol= 1e-4 # CFy
184- @test loop_sol. force_coefficients[3 ] ≈ 0.49055973654418716 atol= 1e-4 # CFz
185- @test loop_sol. force_coefficients[3 ] / loop_sol. force_coefficients[1 ] ≈ loop_sol. force[3 ] / loop_sol. force[1 ]
186- @test loop_sol. moment_distribution[1 ] ≈ - 0.0006683569356186426 atol= 1e-8
187- @test loop_sol. moment_coeff_dist[1 ] ≈ - 2.212405554436003e-7 atol= 1e-10
188- @test loop_sol. moment_distribution[1 ] / loop_sol. moment_distribution[2 ] ≈ loop_sol. moment_coeff_dist[1 ] / loop_sol. moment_coeff_dist[2 ]
189-
190- @test loop_sol. solver_status == FEASIBLE
191- end
192-
193- # Calculate forces using uncorrected alpha
194- alpha = results_NEW[" alpha_uncorrected" ]
195- dyn_visc = 0.5 * density * norm (v_a)^ 2
196- n_panels = length (body_aero. panels)
197- lift = zeros (n_panels)
198- drag = zeros (n_panels)
199- moment = zeros (n_panels)
200-
201- for (i, panel) in enumerate (body_aero. panels)
202- lift[i] = dyn_visc * calculate_cl (panel, alpha[i]) * panel. chord
203- cd_cm = calculate_cd_cm (panel, alpha[i])
204- drag[i] = dyn_visc * cd_cm[1 ] * panel. chord
205- moment[i] = dyn_visc * cd_cm[2 ] * panel. chord^ 2
206- # @info "lift: $lift, drag: $drag, moment: $moment"
207- end
208- Fmag = hcat (lift, drag, moment)
209-
210- # Calculate coefficients using corrected alpha
211- alpha = results_NEW[" alpha_at_ac" ]
212- aero_coeffs = hcat (
213- [alpha[i] for (i, panel) in enumerate (body_aero. panels)],
214- [calculate_cl (panel, alpha[i]) for (i, panel) in enumerate (body_aero. panels)],
215- [calculate_cd_cm (panel, alpha[i])[1 ] for (i, panel) in enumerate (body_aero. panels)],
216- [calculate_cd_cm (panel, alpha[i])[2 ] for (i, panel) in enumerate (body_aero. panels)]
217- )
218-
219- ringvec = [Dict (" r0" => panel. width * panel. y_airf) for panel in body_aero. panels]
220- controlpoints = [Dict (" tangential" => panel. x_airf, " normal" => panel. z_airf)
221- for panel in body_aero. panels]
222- Atot = calculate_projected_area (wing)
223-
224- F_rel_ref, F_gl_ref, Ltot_ref, Dtot_ref, CL_ref, CD_ref, CS_ref =
225- output_results (Fmag, aero_coeffs, ringvec, v_a, controlpoints, Atot)
226-
227- # Compare results
228- @info " Comparing results"
229- @info " cl_calculated: $(results_NEW[" cl" ]) , CL_ref: $CL_ref "
230- @info " cd_calculated: $(results_NEW[" cd" ]) , CD_ref: $CD_ref "
231- @info " cs_calculated: $(results_NEW[" cs" ]) , CS_ref: $CS_ref "
232- @info " L_calculated: $(results_NEW[" lift" ]) , Ltot_ref: $Ltot_ref "
233- @info " D_calculated: $(results_NEW[" drag" ]) , Dtot_ref: $Dtot_ref "
234-
235- # Assert results
236- @test isapprox (results_NEW[" cl" ], CL_ref, rtol= 1e-4 )
237- @test isapprox (results_NEW[" cd" ], CD_ref, rtol= 1e-4 )
238- @test isapprox (results_NEW[" cs" ], CS_ref, rtol= 1e-4 )
239- @test isapprox (results_NEW[" lift" ], Ltot_ref, rtol= 1e-4 )
240- @test isapprox (results_NEW[" drag" ], Dtot_ref, rtol= 1e-4 )
241- @test isapprox (results_NEW[" Fx" ], results_NEW[" Mz" ], rtol= 1e-4 ) # 1 meter arm
242- @test isapprox (results_NEW[" My" ], 0.0 , atol= 1e-3 )
243- @test isapprox (results_NEW[" Fz" ], - results_NEW[" Mx" ], rtol= 1e-4 ) # 1 meter arm
244-
245- # Check array shapes
246- @test length (results_NEW[" cl_distribution" ]) == length (body_aero. panels)
247- @test length (results_NEW[" cd_distribution" ]) == length (body_aero. panels)
248- end
249-
250116@testset " Wing Geometry Creation" begin
251117 @testset " Origin Translation" begin
252118 # Create minimal wing with three sections (2 panels)
0 commit comments