Skip to content

Commit 9e2834a

Browse files
committed
reduce allocations more
1 parent ce5f5b6 commit 9e2834a

File tree

1 file changed

+50
-22
lines changed

1 file changed

+50
-22
lines changed

src/solver.jl

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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
171171
end
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

Comments
 (0)