@@ -74,7 +74,7 @@ function solve(solver::Solver, wing_aero::WingAerodynamics, gamma_distribution=n
7474 z_airf_array = zeros (n_panels, 3 )
7575 va_array = zeros (n_panels, 3 )
7676 chord_array = zeros (n_panels)
77-
77+
7878 # Fill arrays from panels
7979 for (i, panel) in enumerate (panels)
8080 x_airf_array[i, :] .= panel. x_airf
@@ -170,6 +170,8 @@ function solve(solver::Solver, wing_aero::WingAerodynamics, gamma_distribution=n
170170 return results
171171end
172172
173+ cross3 (x,y) = cross (SVector {3,eltype(x)} (x), SVector {3,eltype(y)} (y))
174+
173175"""
174176 gamma_loop(solver::Solver, gamma_new::Vector{Float64}, AIC_x::Matrix{Float64},
175177 AIC_y::Matrix{Float64}, AIC_z::Matrix{Float64}, va_array::Matrix{Float64},
@@ -195,52 +197,78 @@ function gamma_loop(
195197 relaxation_factor:: Float64
196198)
197199 converged = false
200+ n_panels = wing_aero. n_panels
198201 alpha_array = wing_aero. alpha_array
199202 Umag_array = wing_aero. Umag_array
200-
203+ Umagw_array = similar (Umag_array)
204+
205+ gamma = copy (gamma_new)
206+ abs_gamma_new = copy (gamma_new)
207+ induced_velocity_all = zeros (size (AIC_x, 1 ), 3 )
208+ relative_velocity_array = similar (va_array)
209+ relative_velocity_crossz = similar (relative_velocity_array)
210+ Uinfcrossz_array = similar (va_array)
211+ cl_array = zeros (n_panels)
212+ damp = zeros (length (gamma))
213+ v_normal_array = zeros (n_panels)
214+ v_tangential_array = zeros (n_panels)
215+
201216 iters = 0
202217 for i in 1 : solver. max_iterations
203218 iters += 1
204- gamma = copy ( gamma_new)
219+ gamma . = gamma_new
205220
206221 # Calculate induced velocities
207- induced_velocity_all = hcat (
208- AIC_x * gamma,
209- AIC_y * gamma,
210- AIC_z * gamma
211- )
222+ mul! (view (induced_velocity_all, :, 1 ), AIC_x, gamma)
223+ mul! (view (induced_velocity_all, :, 2 ), AIC_y, gamma)
224+ mul! (view (induced_velocity_all, :, 3 ), AIC_z, gamma)
212225
213- relative_velocity_array = va_array .+ induced_velocity_all
214- relative_velocity_crossz = cross .(eachrow (relative_velocity_array), eachrow (z_airf_array))
215- Uinfcrossz_array = cross .(eachrow (va_array), eachrow (z_airf_array))
226+ relative_velocity_array .= va_array .+ induced_velocity_all
227+ for i in 1 : n_panels
228+ relative_velocity_crossz[i, :] .= cross3 (
229+ view (relative_velocity_array, i, :),
230+ view (z_airf_array, i, :)
231+ )
232+ Uinfcrossz_array[i, :] .= cross3 (
233+ view (va_array, i, :),
234+ view (z_airf_array, i, :)
235+ )
236+ end
216237
217- v_normal_array = vec (sum (x_airf_array .* relative_velocity_array, dims= 2 ))
218- v_tangential_array = vec (sum (y_airf_array .* relative_velocity_array, dims= 2 ))
238+ for i in 1 : n_panels
239+ v_normal_array[i] = dot (view (x_airf_array, i, :), view (relative_velocity_array, i, :))
240+ v_tangential_array[i] = dot (view (y_airf_array, i, :), view (relative_velocity_array, i, :))
241+ end
219242 alpha_array .= atan .(v_normal_array, v_tangential_array)
243+
244+ for i in 1 : n_panels
245+ @views Umag_array[i] = norm (relative_velocity_crossz[i, :])
246+ @views Umagw_array[i] = norm (Uinfcrossz_array[i, :])
247+ end
220248
221- Umag_array .= norm .(relative_velocity_crossz)
222- Umagw_array = norm .(Uinfcrossz_array)
223-
224- cl_array = [calculate_cl (panel, alpha) for (panel, alpha) in zip (panels, alpha_array)]
249+ for (i, (panel, alpha)) in enumerate (zip (panels, alpha_array))
250+ cl_array[i] = calculate_cl (panel, alpha)
251+ end
225252 gamma_new .= 0.5 .* Umag_array.^ 2 ./ Umagw_array .* cl_array .* chord_array
226253
227254 # Apply damping if needed
228255 if solver. is_with_artificial_damping
229256 damp, is_damping_applied = smooth_circulation (gamma, 0.1 , 0.5 )
230257 @debug " damp: $damp "
231258 else
232- damp = zeros ( length (gamma))
259+ damp . = 0.0
233260 is_damping_applied = false
234261 end
235-
236262 # Update gamma with relaxation and damping
237- gamma_new = (1 - relaxation_factor) .* gamma +
263+ gamma_new . = (1 - relaxation_factor) .* gamma . +
238264 relaxation_factor .* gamma_new .+ damp
239265
240266 # Check convergence
241- reference_error = maximum (abs .(gamma_new))
267+ abs_gamma_new .= abs .(gamma_new)
268+ reference_error = maximum (abs_gamma_new)
242269 reference_error = max (reference_error, solver. tol_reference_error)
243- error = maximum (abs .(gamma_new - gamma))
270+ abs_gamma_new .= abs .(gamma_new .- gamma)
271+ error = maximum (abs_gamma_new)
244272 normalized_error = error / reference_error
245273
246274 @debug " Iteration: $i , normalized_error: $normalized_error , is_damping_applied: $is_damping_applied "
0 commit comments