From 52560dc82c46610dd81779df3b387f880b1bbc3f Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 03:30:00 +0100 Subject: [PATCH 01/85] Reduce allocations --- src/solver.jl | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 45fa2df6..0718f3ba 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -133,10 +133,21 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= panel_width_array[i] = panel.width end - # Calculate forces - lift = reshape((cl_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) # 336 bytes - drag = reshape((cd_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) - moment = reshape((cm_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) + # # Calculate forces + # lift = reshape((cl_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) # 336 bytes + # drag = reshape((cd_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) + # moment = reshape((cm_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) + + # Pre-allocate output matrices + lift = similar(cl_array, length(cl_array), 1) + drag = similar(lift) + moment = similar(lift) + + # Compute using fused broadcasting (no intermediate allocations) + @. lift = cl_array * 0.5 * density * v_a_array^2 * chord_array + @. drag = cd_array * 0.5 * density * v_a_array^2 * chord_array + @. moment = cm_array * 0.5 * density * v_a_array^2 * chord_array + # Calculate alpha corrections based on model type alpha_corrected = if aerodynamic_model_type == VSM # 4188 bytes From 5306b4b689c9ef4056ccdce20a43191958f0b3d5 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 03:48:04 +0100 Subject: [PATCH 02/85] Use normalize! --- src/solver.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 0718f3ba..450a00a4 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -199,15 +199,15 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Calculate induced velocity direction alpha_corrected_i = alpha_corrected[i] - induced_va_airfoil = cos(alpha_corrected_i) * panel.x_airf + - sin(alpha_corrected_i) * panel.z_airf - dir_induced_va_airfoil = induced_va_airfoil / norm(induced_va_airfoil) + dir_induced_va_airfoil = cos(alpha_corrected_i) * panel.x_airf + + sin(alpha_corrected_i) * panel.z_airf + normalize!(dir_induced_va_airfoil) # Calculate lift and drag directions dir_lift_induced_va = cross(dir_induced_va_airfoil, panel.y_airf) - dir_lift_induced_va = dir_lift_induced_va / norm(dir_lift_induced_va) + normalize!(dir_lift_induced_va) dir_drag_induced_va = cross(spanwise_direction, dir_lift_induced_va) - dir_drag_induced_va = dir_drag_induced_va / norm(dir_drag_induced_va) + normalize!(dir_drag_induced_va) # Calculate force vectors lift_induced_va = lift[i] * dir_lift_induced_va From 3cfff2f12fd0188c8e0fde9b42fc88c168325d1c Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 04:17:51 +0100 Subject: [PATCH 03/85] Reduce allocations --- src/solver.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 450a00a4..e691c930 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -245,9 +245,9 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Vector from panel AC to the chosen reference point: r_vector = panel_ac_body - reference_point # e.g. CG, wing root, etc. # Cross product to shift the force from panel AC to ref. point: - M_shift = cross(r_vector, f_body_3D[:,i]) + M_shift = cross(r_vector, MVec3(f_body_3D[:,i])) # Total panel moment about the reference point: - m_body_3D[:,i] = M_local_3D + M_shift + m_body_3D[:,i] .= M_local_3D + M_shift # Calculate the moment distribution (moment on each panel) arm = (moment_frac - 0.25) * panel.chord From 858c03674c8ad6defd06010b2d57aa09ff9c99ce Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 04:23:16 +0100 Subject: [PATCH 04/85] Use \cdot --- src/solver.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index e691c930..3f015f0a 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -251,7 +251,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Calculate the moment distribution (moment on each panel) arm = (moment_frac - 0.25) * panel.chord - moment_distribution[i] = dot(ftotal_induced_va, panel.z_airf) * arm + moment_distribution[i] = (ftotal_induced_va ⋅ panel.z_airf) * arm moment_coefficient_distribution[i] = moment_distribution[i] / (q_inf * projected_area) end @@ -510,8 +510,8 @@ function gamma_loop( end for i in 1:n_panels - v_normal_array[i] = dot(view(z_airf_array, i, :), view(relative_velocity_array, i, :)) - v_tangential_array[i] = dot(view(x_airf_array, i, :), view(relative_velocity_array, i, :)) + v_normal_array[i] = view(z_airf_array, i, :) ⋅ view(relative_velocity_array, i, :) + v_tangential_array[i] = view(x_airf_array, i, :) ⋅ view(relative_velocity_array, i, :) end alpha_array .= atan.(v_normal_array, v_tangential_array) From 50254d5bf86e30727229ebc8c1af1b22ad1b0dea Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 04:32:18 +0100 Subject: [PATCH 05/85] Cleanup --- src/solver.jl | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 3f015f0a..da8e1b1b 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -133,11 +133,6 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= panel_width_array[i] = panel.width end - # # Calculate forces - # lift = reshape((cl_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) # 336 bytes - # drag = reshape((cd_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) - # moment = reshape((cm_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) - # Pre-allocate output matrices lift = similar(cl_array, length(cl_array), 1) drag = similar(lift) @@ -168,18 +163,10 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= end # Initialize result arrays - # cl_prescribed_va = Float64[] - # cd_prescribed_va = Float64[] - # cs_prescribed_va = Float64[] f_body_3D = zeros(3, n_panels) m_body_3D = zeros(3, n_panels) area_all_panels = 0.0 - # Initialize force sums - lift_wing_3D_sum = 0.0 - drag_wing_3D_sum = 0.0 - side_wing_3D_sum = 0.0 - # Get wing properties spanwise_direction = body_aero.wings[1].spanwise_direction va_mag = norm(body_aero.va) @@ -214,18 +201,6 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= drag_induced_va = drag[i] * dir_drag_induced_va ftotal_induced_va = lift_induced_va + drag_induced_va - # # Calculate forces in prescribed wing frame - # dir_lift_prescribed_va = cross(va, spanwise_direction) - # dir_lift_prescribed_va = dir_lift_prescribed_va / norm(dir_lift_prescribed_va) - - # # Calculate force components - # lift_prescribed_va = dot(lift_induced_va, dir_lift_prescribed_va) + - # dot(drag_induced_va, dir_lift_prescribed_va) - # drag_prescribed_va = dot(lift_induced_va, va_unit) + - # dot(drag_induced_va, va_unit) - # side_prescribed_va = dot(lift_induced_va, spanwise_direction) + - # dot(drag_induced_va, spanwise_direction) - # Body frame forces f_body_3D[:,i] .= ftotal_induced_va .* panel.width From 7a720822ad2fef27b1f1c59eed3d1ad2246e4377 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 05:04:27 +0100 Subject: [PATCH 06/85] Replace cross with \times --- src/solver.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index da8e1b1b..3c91c460 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -191,9 +191,9 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= normalize!(dir_induced_va_airfoil) # Calculate lift and drag directions - dir_lift_induced_va = cross(dir_induced_va_airfoil, panel.y_airf) + dir_lift_induced_va = dir_induced_va_airfoil × panel.y_airf normalize!(dir_lift_induced_va) - dir_drag_induced_va = cross(spanwise_direction, dir_lift_induced_va) + dir_drag_induced_va = spanwise_direction × dir_lift_induced_va normalize!(dir_drag_induced_va) # Calculate force vectors @@ -220,7 +220,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Vector from panel AC to the chosen reference point: r_vector = panel_ac_body - reference_point # e.g. CG, wing root, etc. # Cross product to shift the force from panel AC to ref. point: - M_shift = cross(r_vector, MVec3(f_body_3D[:,i])) + M_shift = r_vector × MVec3(f_body_3D[:,i]) # Total panel moment about the reference point: m_body_3D[:,i] .= M_local_3D + M_shift @@ -415,7 +415,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut ) end -cross3(x,y) = cross(SVector{3,eltype(x)}(x), SVector{3,eltype(y)}(y)) +cross3(x,y) = SVector{3,eltype(x)}(x) × SVector{3,eltype(y)}(y) """ gamma_loop(solver::Solver, gamma_new::Vector{Float64}, AIC_x::Matrix{Float64}, From 2133d624c48f5c5f6ca5a2a0a0cc31655b8b535e Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 11:58:05 +0100 Subject: [PATCH 07/85] Add bench2.jl --- test/bench2.jl | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 test/bench2.jl diff --git a/test/bench2.jl b/test/bench2.jl new file mode 100644 index 00000000..810204c4 --- /dev/null +++ b/test/bench2.jl @@ -0,0 +1,54 @@ +using LinearAlgebra +using ControlPlots +using VortexStepMethod +using BenchmarkTools + +using Pkg + +if !("CSV" ∈ keys(Pkg.project().dependencies)) + using TestEnv + TestEnv.activate() +end + +# Step 1: Define wing parameters +n_panels = 20 # Number of panels +span = 20.0 # Wing span [m] +chord = 1.0 # Chord length [m] +v_a = 20.0 # Magnitude of inflow velocity [m/s] +density = 1.225 # Air density [kg/m³] +alpha_deg = 30.0 # Angle of attack [degrees] +alpha = deg2rad(alpha_deg) + +# Step 2: Create wing geometry with linear panel distribution +wing = Wing(n_panels, spanwise_panel_distribution=LINEAR) + +# Add wing sections - defining only tip sections with inviscid airfoil model +add_section!(wing, + [0.0, span/2, 0.0], # Left tip LE + [chord, span/2, 0.0], # Left tip TE + INVISCID) +add_section!(wing, + [0.0, -span/2, 0.0], # Right tip LE + [chord, -span/2, 0.0], # Right tip TE + INVISCID) + +# Step 3: Initialize aerodynamics +wa = BodyAerodynamics([wing]) + +# Set inflow conditions +vel_app = [cos(alpha), 0.0, sin(alpha)] .* v_a +set_va!(wa, vel_app) + +# Step 4: Initialize solvers for both LLT and VSM methods +llt_solver = Solver(aerodynamic_model_type=LLT) +vsm_solver = Solver(aerodynamic_model_type=VSM) + +# Step 5: Solve using both methods +println("Rectangular wing, solve_base:") +@btime results_vsm_base = solve_base($vsm_solver, $wa) +# time Python: 32.0 ms Ryzen 7950x +# time Julia: 0.6 ms Ryzen 7950x +# 0.8 ms laptop, performance mode, battery +println("Rectangular wing, solve!:") +@btime sol = solve!($vsm_solver, $wa) +nothing \ No newline at end of file From 210e13b90c89fabbf9b2f8f6478bfd67b84a5902 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 12:00:28 +0100 Subject: [PATCH 08/85] Update comments --- test/bench2.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/bench2.jl b/test/bench2.jl index 810204c4..997eeef9 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -45,10 +45,10 @@ vsm_solver = Solver(aerodynamic_model_type=VSM) # Step 5: Solve using both methods println("Rectangular wing, solve_base:") -@btime results_vsm_base = solve_base($vsm_solver, $wa) +@btime results_vsm_base = solve_base($vsm_solver, $wa) # 112 allocations # time Python: 32.0 ms Ryzen 7950x # time Julia: 0.6 ms Ryzen 7950x -# 0.8 ms laptop, performance mode, battery +# 0.47 ms laptop, performance mode, grid println("Rectangular wing, solve!:") -@btime sol = solve!($vsm_solver, $wa) +@btime sol = solve!($vsm_solver, $wa) # 608 allocations nothing \ No newline at end of file From 3a3d7fa3eadf1eac169d22c4b3878613b11ac61f Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 12:08:40 +0100 Subject: [PATCH 09/85] Add P to VSMSolution and bench2.jl --- src/solver.jl | 10 +++++----- test/bench2.jl | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 3c91c460..1d7c860e 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -14,7 +14,7 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all - moment_coefficient_distribution::Vector{Float64}: Pitching moment coefficient around the spanwise vector of each panel. [-] - solver_status::SolverStatus: enum, see [SolverStatus](@ref) """ -mutable struct VSMSolution +mutable struct VSMSolution{P} gamma_distribution::Union{Nothing, Vector{Float64}} aero_force::MVec3 aero_moments::MVec3 @@ -25,8 +25,8 @@ mutable struct VSMSolution solver_status::SolverStatus end -function VSMSolution() - VSMSolution(nothing, zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(3), zeros(3), FAILURE) +function VSMSolution(P) + VSMSolution{P}(nothing, zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(3), zeros(3), FAILURE) end """ @@ -57,7 +57,7 @@ Main solver structure for the Vortex Step Method.See also: [solve](@ref) ## Solution sol::VSMSolution = VSMSolution(): The result of calling [solve!](@ref) """ -@with_kw struct Solver +@with_kw struct Solver{P} # General settings aerodynamic_model_type::Model = VSM density::Float64 = 1.225 @@ -77,7 +77,7 @@ sol::VSMSolution = VSMSolution(): The result of calling [solve!](@ref) is_only_f_and_gamma_output::Bool = false # Solution - sol::VSMSolution = VSMSolution() + sol::VSMSolution{P} = VSMSolution(P) end """ diff --git a/test/bench2.jl b/test/bench2.jl index 997eeef9..7303b485 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -40,8 +40,8 @@ vel_app = [cos(alpha), 0.0, sin(alpha)] .* v_a set_va!(wa, vel_app) # Step 4: Initialize solvers for both LLT and VSM methods -llt_solver = Solver(aerodynamic_model_type=LLT) -vsm_solver = Solver(aerodynamic_model_type=VSM) +P = length(wa.panels) +vsm_solver = Solver{P}(aerodynamic_model_type=VSM) # Step 5: Solve using both methods println("Rectangular wing, solve_base:") @@ -50,5 +50,5 @@ println("Rectangular wing, solve_base:") # time Julia: 0.6 ms Ryzen 7950x # 0.47 ms laptop, performance mode, grid println("Rectangular wing, solve!:") -@btime sol = solve!($vsm_solver, $wa) # 608 allocations +@btime sol = solve!($vsm_solver, $wa) # 608 allocations nothing \ No newline at end of file From 1cba421e37177deb6d5cdfa2c50d5ceef25d575f Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 12:15:05 +0100 Subject: [PATCH 10/85] Make use of panel_width_array --- src/solver.jl | 5 +++-- test/bench2.jl | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 1d7c860e..b4eae220 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -15,6 +15,7 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all - solver_status::SolverStatus: enum, see [SolverStatus](@ref) """ mutable struct VSMSolution{P} + panel_width_array::Vector{Float64} gamma_distribution::Union{Nothing, Vector{Float64}} aero_force::MVec3 aero_moments::MVec3 @@ -26,7 +27,7 @@ mutable struct VSMSolution{P} end function VSMSolution(P) - VSMSolution{P}(nothing, zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(3), zeros(3), FAILURE) + VSMSolution{P}(zeros(P), nothing, zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(3), zeros(3), FAILURE) end """ @@ -120,7 +121,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= cl_array = zeros(n_panels) cd_array = zeros(n_panels) cm_array = zeros(n_panels) - panel_width_array = zeros(n_panels) + panel_width_array = solver.sol.panel_width_array solver.sol.moment_distribution = zeros(n_panels) solver.sol.moment_coefficient_distribution = zeros(n_panels) moment_distribution = solver.sol.moment_distribution diff --git a/test/bench2.jl b/test/bench2.jl index 7303b485..14c834f6 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -1,5 +1,4 @@ using LinearAlgebra -using ControlPlots using VortexStepMethod using BenchmarkTools From 470565881f73547e91ce2c07707b70ed9bacc128 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 12:19:29 +0100 Subject: [PATCH 11/85] Now 112, 600 allocations --- src/solver.jl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index b4eae220..02a0a0c5 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -16,6 +16,9 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all """ mutable struct VSMSolution{P} panel_width_array::Vector{Float64} + cl_array::Vector{Float64} + cd_array::Vector{Float64} + cm_array::Vector{Float64} gamma_distribution::Union{Nothing, Vector{Float64}} aero_force::MVec3 aero_moments::MVec3 @@ -27,7 +30,8 @@ mutable struct VSMSolution{P} end function VSMSolution(P) - VSMSolution{P}(zeros(P), nothing, zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(3), zeros(3), FAILURE) + VSMSolution{P}(zeros(P), zeros(P), zeros(P), zeros(P), nothing, + zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(3), zeros(3), FAILURE) end """ @@ -118,9 +122,9 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Initialize arrays n_panels = length(panels) - cl_array = zeros(n_panels) - cd_array = zeros(n_panels) - cm_array = zeros(n_panels) + cl_array = solver.sol.cl_array + cd_array = solver.sol.cd_array + cm_array = solver.sol.cm_array panel_width_array = solver.sol.panel_width_array solver.sol.moment_distribution = zeros(n_panels) solver.sol.moment_coefficient_distribution = zeros(n_panels) From 706c21f322826301c9b958c87354366ea3c6e083 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 12:24:42 +0100 Subject: [PATCH 12/85] Now 596 allocations --- src/solver.jl | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 02a0a0c5..f67c74c6 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -14,24 +14,23 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all - moment_coefficient_distribution::Vector{Float64}: Pitching moment coefficient around the spanwise vector of each panel. [-] - solver_status::SolverStatus: enum, see [SolverStatus](@ref) """ -mutable struct VSMSolution{P} - panel_width_array::Vector{Float64} - cl_array::Vector{Float64} - cd_array::Vector{Float64} - cm_array::Vector{Float64} - gamma_distribution::Union{Nothing, Vector{Float64}} - aero_force::MVec3 - aero_moments::MVec3 - force_coefficients::MVec3 - moment_coefficients::MVec3 - moment_distribution::Vector{Float64} - moment_coefficient_distribution::Vector{Float64} - solver_status::SolverStatus +@with_kw mutable struct VSMSolution{P} + panel_width_array::Vector{Float64} = zeros(P) + cl_array::Vector{Float64} = zeros(P) + cd_array::Vector{Float64} = zeros(P) + cm_array::Vector{Float64} = zeros(P) + gamma_distribution::Union{Nothing, Vector{Float64}} = nothing + aero_force::MVec3 = zeros(MVec3) + aero_moments::MVec3 = zeros(MVec3) + force_coefficients::MVec3 = zeros(MVec3) + moment_coefficients::MVec3 = zeros(MVec3) + moment_distribution::Vector{Float64} = zeros(P) + moment_coefficient_distribution::Vector{Float64} = zeros(P) + solver_status::SolverStatus = FAILURE end function VSMSolution(P) - VSMSolution{P}(zeros(P), zeros(P), zeros(P), zeros(P), nothing, - zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(3), zeros(3), FAILURE) + VSMSolution{P}() end """ @@ -126,8 +125,8 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= cd_array = solver.sol.cd_array cm_array = solver.sol.cm_array panel_width_array = solver.sol.panel_width_array - solver.sol.moment_distribution = zeros(n_panels) - solver.sol.moment_coefficient_distribution = zeros(n_panels) + solver.sol.moment_distribution .= 0 + solver.sol.moment_coefficient_distribution .= 0 moment_distribution = solver.sol.moment_distribution moment_coefficient_distribution = solver.sol.moment_coefficient_distribution From 429f5d365d0bbc01bdbe5d7fe35a1fbbda344128 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 15:16:54 +0100 Subject: [PATCH 13/85] Down to 590 allocations --- src/solver.jl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index f67c74c6..8cb79bb0 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -19,6 +19,9 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all cl_array::Vector{Float64} = zeros(P) cd_array::Vector{Float64} = zeros(P) cm_array::Vector{Float64} = zeros(P) + lift::Matrix{Float64} = zeros(P,1) + drag::Matrix{Float64} = zeros(P,1) + moment::Matrix{Float64} = zeros(P,1) gamma_distribution::Union{Nothing, Vector{Float64}} = nothing aero_force::MVec3 = zeros(MVec3) aero_moments::MVec3 = zeros(MVec3) @@ -137,10 +140,10 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= panel_width_array[i] = panel.width end - # Pre-allocate output matrices - lift = similar(cl_array, length(cl_array), 1) - drag = similar(lift) - moment = similar(lift) + # create an alias for the three vertical output vectors + lift = solver.sol.lift + drag = solver.sol.drag + moment = solver.sol.moment # Compute using fused broadcasting (no intermediate allocations) @. lift = cl_array * 0.5 * density * v_a_array^2 * chord_array From b71846dbd2545d6792f9c1b82276dbfe58b9c83b Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 15:17:40 +0100 Subject: [PATCH 14/85] Cleanup --- src/solver.jl | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 8cb79bb0..ea76bfb3 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -211,11 +211,6 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Body frame forces f_body_3D[:,i] .= ftotal_induced_va .* panel.width - # # Update sums - # lift_wing_3D_sum += lift_prescribed_va * panel.width - # drag_wing_3D_sum += drag_prescribed_va * panel.width - # side_wing_3D_sum += side_prescribed_va * panel.width - # Calculate the moments # (1) Panel aerodynamic center in body frame: panel_ac_body = panel.aero_center # 3D [x, y, z] From f06db22cc3a212f968c643bd95d8fe302d19d5e2 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 15:18:42 +0100 Subject: [PATCH 15/85] Update comment --- test/bench2.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/bench2.jl b/test/bench2.jl index 14c834f6..18ef38c1 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -49,5 +49,5 @@ println("Rectangular wing, solve_base:") # time Julia: 0.6 ms Ryzen 7950x # 0.47 ms laptop, performance mode, grid println("Rectangular wing, solve!:") -@btime sol = solve!($vsm_solver, $wa) # 608 allocations +@btime sol = solve!($vsm_solver, $wa) # 590 allocations nothing \ No newline at end of file From 48e856ee8540bb6cdf924342be3a5b0aa904a0d3 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 16:29:52 +0100 Subject: [PATCH 16/85] Fix tests --- test/bench.jl | 8 +++++--- test/test_body_aerodynamics.jl | 3 ++- test/test_plotting.jl | 5 +++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/test/bench.jl b/test/bench.jl index bd1d8a14..e267d672 100644 --- a/test/bench.jl +++ b/test/bench.jl @@ -44,7 +44,8 @@ using LinearAlgebra set_va!(body_aero, vel_app) # Initialize solvers for both LLT and VSM methods - solver = Solver() + P = length(body_aero.panels) + solver = Solver{P}() # Pre-allocate arrays gamma = rand(n_panels) @@ -112,8 +113,9 @@ using LinearAlgebra aero_model, aero_data) body_aero = BodyAerodynamics([wing]) - - solver = Solver( + + P = length(body_aero.panels) + solver = Solver{P}( aerodynamic_model_type=model ) result = @benchmark gamma_loop( diff --git a/test/test_body_aerodynamics.jl b/test/test_body_aerodynamics.jl index 827e3ae1..d30f738c 100644 --- a/test/test_body_aerodynamics.jl +++ b/test/test_body_aerodynamics.jl @@ -145,7 +145,8 @@ end set_va!(body_aero, v_a) # Run analysis - solver_object = Solver( + P = length(body_aero.panels) + solver_object = Solver{P}( aerodynamic_model_type=model, core_radius_fraction=core_radius_fraction ) diff --git a/test/test_plotting.jl b/test/test_plotting.jl index 96a07735..06f2ebc1 100644 --- a/test/test_plotting.jl +++ b/test/test_plotting.jl @@ -63,8 +63,9 @@ plt.ioff() rm("/tmp/Rectangular_wing_geometry_top_view.pdf") # Step 5: Initialize the solvers - vsm_solver = Solver(aerodynamic_model_type=VSM) - llt_solver = Solver(aerodynamic_model_type=LLT) + P = length(body_aero.panels) + vsm_solver = Solver{P}(aerodynamic_model_type=VSM) + llt_solver = Solver{P}(aerodynamic_model_type=LLT) # Step 6: Solve the VSM and LLT results_vsm = solve(vsm_solver, body_aero) From a18b3b8e5dca8b96e8ea9616a114ca7c9edccd80 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 16:38:07 +0100 Subject: [PATCH 17/85] Fix examples --- examples/bench.jl | 8 +++++--- examples/ram_air_kite.jl | 3 ++- examples/rectangular_wing.jl | 5 +++-- examples/stall_model.jl | 5 +++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/examples/bench.jl b/examples/bench.jl index 5beeeebd..6e6524fb 100644 --- a/examples/bench.jl +++ b/examples/bench.jl @@ -39,8 +39,9 @@ vel_app = [cos(alpha), 0.0, sin(alpha)] .* v_a set_va!(wa, vel_app) # Step 4: Initialize solvers for both LLT and VSM methods -llt_solver = Solver(aerodynamic_model_type=LLT) -vsm_solver = Solver(aerodynamic_model_type=VSM) +P = length(wa.panels) +llt_solver = Solver{P}(aerodynamic_model_type=LLT) +vsm_solver = Solver{P}(aerodynamic_model_type=VSM) # Step 5: Solve using both methods results_vsm = solve(vsm_solver, wa) @@ -61,7 +62,8 @@ wing = RamAirWing("data/ram_air_kite_body.obj", "data/ram_air_kite_foil.dat") body_aero = BodyAerodynamics([wing]) # Create solvers -vsm_solver = Solver( +P = length(wa.panels) +vsm_solver = Solver{P}( aerodynamic_model_type=VSM, is_with_artificial_damping=false ) diff --git a/examples/ram_air_kite.jl b/examples/ram_air_kite.jl index 93e72ce3..1aa53da8 100644 --- a/examples/ram_air_kite.jl +++ b/examples/ram_air_kite.jl @@ -24,7 +24,8 @@ if DEFORM end # Create solvers -vsm_solver = Solver( +P = length(body_aero.panels) +vsm_solver = Solver{P}( aerodynamic_model_type=VSM, is_with_artificial_damping=false ) diff --git a/examples/rectangular_wing.jl b/examples/rectangular_wing.jl index 318a3ada..27995a3a 100644 --- a/examples/rectangular_wing.jl +++ b/examples/rectangular_wing.jl @@ -35,8 +35,9 @@ vel_app = [cos(alpha), 0.0, sin(alpha)] .* v_a set_va!(wa, vel_app, [0, 0, 0.1]) # Step 4: Initialize solvers for both LLT and VSM methods -llt_solver = Solver(aerodynamic_model_type=LLT) -vsm_solver = Solver(aerodynamic_model_type=VSM) +P = length(wa.panels) +llt_solver = Solver{P}(aerodynamic_model_type=LLT) +vsm_solver = Solver{P}(aerodynamic_model_type=VSM) # Step 5: Solve using both methods results_llt = solve(llt_solver, wa) diff --git a/examples/stall_model.jl b/examples/stall_model.jl index 97c3b2a5..cd13a992 100644 --- a/examples/stall_model.jl +++ b/examples/stall_model.jl @@ -45,11 +45,12 @@ end body_aero_CAD_19ribs = BodyAerodynamics([CAD_wing]) # Create solvers -vsm_solver = Solver( +P = length(wa.panels) +vsm_solver = Solver{P}( aerodynamic_model_type=VSM, is_with_artificial_damping=false ) -VSM_with_stall_correction = Solver( +VSM_with_stall_correction = Solver{P}( aerodynamic_model_type=VSM, is_with_artificial_damping=true ) From a247fa8d1539a312e093ab655053b0f6b593a199 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 16:48:02 +0100 Subject: [PATCH 18/85] Cleanup --- src/solver.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index ea76bfb3..236005b5 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -177,8 +177,6 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Get wing properties spanwise_direction = body_aero.wings[1].spanwise_direction va_mag = norm(body_aero.va) - va = body_aero.va - va_unit = va / va_mag q_inf = 0.5 * density * va_mag^2 # Calculate wing geometry properties From 02cb7147ada5c29397177cb21b4a69950fa860a2 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 17:28:39 +0100 Subject: [PATCH 19/85] Down to 586 allocations --- src/solver.jl | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 236005b5..67f5d34b 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -22,6 +22,8 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all lift::Matrix{Float64} = zeros(P,1) drag::Matrix{Float64} = zeros(P,1) moment::Matrix{Float64} = zeros(P,1) + f_body_3D::Matrix{Float64} = zeros(3, P) + m_body_3D::Matrix{Float64} = zeros(3, P) gamma_distribution::Union{Nothing, Vector{Float64}} = nothing aero_force::MVec3 = zeros(MVec3) aero_moments::MVec3 = zeros(MVec3) @@ -170,8 +172,6 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= end # Initialize result arrays - f_body_3D = zeros(3, n_panels) - m_body_3D = zeros(3, n_panels) area_all_panels = 0.0 # Get wing properties @@ -207,7 +207,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= ftotal_induced_va = lift_induced_va + drag_induced_va # Body frame forces - f_body_3D[:,i] .= ftotal_induced_va .* panel.width + solver.sol.f_body_3D[:,i] .= ftotal_induced_va .* panel.width # Calculate the moments # (1) Panel aerodynamic center in body frame: @@ -220,9 +220,9 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Vector from panel AC to the chosen reference point: r_vector = panel_ac_body - reference_point # e.g. CG, wing root, etc. # Cross product to shift the force from panel AC to ref. point: - M_shift = r_vector × MVec3(f_body_3D[:,i]) + M_shift = r_vector × MVec3(solver.sol.f_body_3D[:,i]) # Total panel moment about the reference point: - m_body_3D[:,i] .= M_local_3D + M_shift + solver.sol.m_body_3D[:,i] .= M_local_3D + M_shift # Calculate the moment distribution (moment on each panel) arm = (moment_frac - 0.25) * panel.chord @@ -232,14 +232,14 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # update the result struct solver.sol.aero_force .= [ - sum(f_body_3D[1,:]), - sum(f_body_3D[2,:]), - sum(f_body_3D[3,:]) + sum(solver.sol.f_body_3D[1,:]), + sum(solver.sol.f_body_3D[2,:]), + sum(solver.sol.f_body_3D[3,:]) ] solver.sol.aero_moments .= [ - sum(m_body_3D[1,:]), - sum(m_body_3D[2,:]), - sum(m_body_3D[3,:]) + sum(solver.sol.m_body_3D[1,:]), + sum(solver.sol.m_body_3D[2,:]), + sum(solver.sol.m_body_3D[3,:]) ] solver.sol.force_coefficients .= solver.sol.aero_force ./ (q_inf * projected_area) solver.sol.moment_coefficients .= solver.sol.aero_moments ./ (q_inf * projected_area) From 1ee0731a3b8b4d90c2d3f44d8009e9dcaa4380ce Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 17:37:24 +0100 Subject: [PATCH 20/85] Refactor update_effective_angle_of_attack_if_VSM() --- src/body_aerodynamics.jl | 75 +++++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 13 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index cef76844..65157c6d 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -436,28 +436,77 @@ function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, va_norm_array::Vector{Float64}, va_unit_array::Matrix{Float64}) - # Calculate AIC matrices at aerodynamic center using LLT method + # Calculate AIC matrices (keep existing optimized view) calculate_AIC_matrices!( body_aero, LLT, core_radius_fraction, va_norm_array, va_unit_array ) AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] - # Calculate induced velocities - induced_velocity = [ - AIC_x * gamma, - AIC_y * gamma, - AIC_z * gamma - ] - induced_velocity = hcat(induced_velocity...) + # Preallocate and calculate induced velocity directly + induced_velocity = similar(va_array) + induced_velocity[:, 1] .= AIC_x * gamma + induced_velocity[:, 2] .= AIC_y * gamma + induced_velocity[:, 3] .= AIC_z * gamma + + # In-place relative velocity calculation + relative_velocity = va_array .+ induced_velocity + + # Preallocate and compute dot products manually + n = size(relative_velocity, 1) + v_normal = Vector{Float64}(undef, n) + v_tangential = Vector{Float64}(undef, n) - # Calculate relative velocities and angles - relative_velocity = va_array + induced_velocity - v_normal = sum(z_airf_array .* relative_velocity, dims=2) - v_tangential = sum(x_airf_array .* relative_velocity, dims=2) - alpha_array = atan.(v_normal ./ v_tangential) + @inbounds for i in 1:n + vn = 0.0 + vt = 0.0 + for j in 1:3 + vn += z_airf_array[i, j] * relative_velocity[i, j] + vt += x_airf_array[i, j] * relative_velocity[i, j] + end + v_normal[i] = vn + v_tangential[i] = vt + end + + # Direct angle calculation without temporary arrays + alpha_array = Vector{Float64}(undef, n) + @inbounds for i in 1:n + alpha_array[i] = atan(v_normal[i], v_tangential[i]) + end + return alpha_array end +# function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, +# gamma::Vector{Float64}, +# core_radius_fraction::Float64, +# z_airf_array::Matrix{Float64}, +# x_airf_array::Matrix{Float64}, +# va_array::Matrix{Float64}, +# va_norm_array::Vector{Float64}, +# va_unit_array::Matrix{Float64}) + +# # Calculate AIC matrices at aerodynamic center using LLT method +# calculate_AIC_matrices!( +# body_aero, LLT, core_radius_fraction, va_norm_array, va_unit_array +# ) +# AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] + +# # Calculate induced velocities +# induced_velocity = [ +# AIC_x * gamma, +# AIC_y * gamma, +# AIC_z * gamma +# ] +# induced_velocity = hcat(induced_velocity...) + +# # Calculate relative velocities and angles +# relative_velocity = va_array + induced_velocity +# v_normal = sum(z_airf_array .* relative_velocity, dims=2) +# v_tangential = sum(x_airf_array .* relative_velocity, dims=2) +# alpha_array = atan.(v_normal ./ v_tangential) +# return alpha_array +# end + """ calculate_results(body_aero::BodyAerodynamics, gamma_new::Vector{Float64}, density::Float64, aerodynamic_model_type::Model, From 92dca3ee5d2a9b1538b5769b940c769401bc8275 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 19:32:43 +0100 Subject: [PATCH 21/85] Now 424 allocations --- src/solver.jl | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 67f5d34b..238a1f06 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -15,6 +15,13 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all - solver_status::SolverStatus: enum, see [SolverStatus](@ref) """ @with_kw mutable struct VSMSolution{P} + ### private vectors of solve_base + x_airf_array::Matrix{Float64} = zeros(P, 3) + y_airf_array::Matrix{Float64} = zeros(P, 3) + z_airf_array::Matrix{Float64} = zeros(P, 3) + va_array::Matrix{Float64} = zeros(P, 3) + chord_array::Vector{Float64} = zeros(P) + ### panel_width_array::Vector{Float64} = zeros(P) cl_array::Vector{Float64} = zeros(P) cd_array::Vector{Float64} = zeros(P) @@ -115,7 +122,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # calculate intermediate result (converged, body_aero, gamma_new, reference_point, density, aerodynamic_model_type, core_radius_fraction, - mu, alpha_array, v_a_array, chord_array, x_airf_array, y_airf_array, z_airf_array, + mu, alpha_array, v_a_array, chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, va_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output) = solve_base(solver, body_aero, gamma_distribution; log, reference_point) if !isnothing(solver.sol.gamma_distribution) @@ -159,8 +166,8 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= body_aero, gamma_new, core_radius_fraction, - z_airf_array, - x_airf_array, + solver.sol.z_airf_array, + solver.sol.x_airf_array, va_array, va_norm_array, va_unit_array @@ -317,17 +324,17 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut relaxation_factor = solver.relaxation_factor # Preallocate arrays - x_airf_array = zeros(n_panels, 3) - y_airf_array = zeros(n_panels, 3) - z_airf_array = zeros(n_panels, 3) + solver.sol.x_airf_array .= 0 + solver.sol.y_airf_array .= 0 + solver.sol.z_airf_array .= 0 va_array = zeros(n_panels, 3) chord_array = zeros(n_panels) # Fill arrays from panels for (i, panel) in enumerate(panels) - x_airf_array[i, :] .= panel.x_airf - y_airf_array[i, :] .= panel.y_airf - z_airf_array[i, :] .= panel.z_airf + solver.sol.x_airf_array[i, :] .= panel.x_airf + solver.sol.y_airf_array[i, :] .= panel.y_airf + solver.sol.z_airf_array[i, :] .= panel.z_airf va_array[i, :] .= panel.va chord_array[i] = panel.chord end @@ -366,9 +373,9 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut gamma_initial, va_array, chord_array, - x_airf_array, - y_airf_array, - z_airf_array, + solver.sol.x_airf_array, + solver.sol.y_airf_array, + solver.sol.z_airf_array, panels, relaxation_factor; log @@ -382,9 +389,9 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut gamma_initial, va_array, chord_array, - x_airf_array, - y_airf_array, - z_airf_array, + solver.sol.x_airf_array, + solver.sol.y_airf_array, + solver.sol.z_airf_array, panels, relaxation_factor/2; log @@ -404,9 +411,9 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut alpha_array, v_a_array, chord_array, - x_airf_array, - y_airf_array, - z_airf_array, + solver.sol.x_airf_array, + solver.sol.y_airf_array, + solver.sol.z_airf_array, va_array, va_norm_array, va_unit_array, From c9afaa1fd644cb04e795d5c87908ef1a734a4baf Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 19:40:13 +0100 Subject: [PATCH 22/85] Now 422 allocations --- src/solver.jl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 238a1f06..1302565d 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -123,7 +123,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # calculate intermediate result (converged, body_aero, gamma_new, reference_point, density, aerodynamic_model_type, core_radius_fraction, mu, alpha_array, v_a_array, chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, - va_array, va_norm_array, va_unit_array, panels, + solver.sol.va_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output) = solve_base(solver, body_aero, gamma_distribution; log, reference_point) if !isnothing(solver.sol.gamma_distribution) solver.sol.gamma_distribution .= gamma_new @@ -168,7 +168,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= core_radius_fraction, solver.sol.z_airf_array, solver.sol.x_airf_array, - va_array, + solver.sol.va_array, va_norm_array, va_unit_array ) @@ -327,7 +327,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver.sol.x_airf_array .= 0 solver.sol.y_airf_array .= 0 solver.sol.z_airf_array .= 0 - va_array = zeros(n_panels, 3) + solver.sol.va_array .= 0 chord_array = zeros(n_panels) # Fill arrays from panels @@ -335,13 +335,13 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver.sol.x_airf_array[i, :] .= panel.x_airf solver.sol.y_airf_array[i, :] .= panel.y_airf solver.sol.z_airf_array[i, :] .= panel.z_airf - va_array[i, :] .= panel.va + solver.sol.va_array[i, :] .= panel.va chord_array[i] = panel.chord end # Calculate unit vectors - va_norm_array = norm.(eachrow(va_array)) - va_unit_array = va_array ./ va_norm_array + va_norm_array = norm.(eachrow(solver.sol.va_array)) + va_unit_array = solver.sol.va_array ./ va_norm_array # Calculate AIC matrices calculate_AIC_matrices!( @@ -371,7 +371,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver, body_aero, gamma_initial, - va_array, + solver.sol.va_array, chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, @@ -387,7 +387,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver, body_aero, gamma_initial, - va_array, + solver.sol.va_array, chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, @@ -414,7 +414,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, - va_array, + solver.sol.va_array, va_norm_array, va_unit_array, panels, From 5f636bef4e4573b7aa3d87687cb8b75cd0900dfb Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 19:47:14 +0100 Subject: [PATCH 23/85] Now 420 allocations --- src/solver.jl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 1302565d..3efedc81 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -122,7 +122,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # calculate intermediate result (converged, body_aero, gamma_new, reference_point, density, aerodynamic_model_type, core_radius_fraction, - mu, alpha_array, v_a_array, chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, + mu, alpha_array, v_a_array, solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, solver.sol.va_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output) = solve_base(solver, body_aero, gamma_distribution; log, reference_point) if !isnothing(solver.sol.gamma_distribution) @@ -155,9 +155,9 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= moment = solver.sol.moment # Compute using fused broadcasting (no intermediate allocations) - @. lift = cl_array * 0.5 * density * v_a_array^2 * chord_array - @. drag = cd_array * 0.5 * density * v_a_array^2 * chord_array - @. moment = cm_array * 0.5 * density * v_a_array^2 * chord_array + @. lift = cl_array * 0.5 * density * v_a_array^2 * solver.sol.chord_array + @. drag = cd_array * 0.5 * density * v_a_array^2 * solver.sol.chord_array + @. moment = cm_array * 0.5 * density * v_a_array^2 * solver.sol.chord_array # Calculate alpha corrections based on model type @@ -328,7 +328,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver.sol.y_airf_array .= 0 solver.sol.z_airf_array .= 0 solver.sol.va_array .= 0 - chord_array = zeros(n_panels) + solver.sol.chord_array .= 0 # Fill arrays from panels for (i, panel) in enumerate(panels) @@ -336,7 +336,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver.sol.y_airf_array[i, :] .= panel.y_airf solver.sol.z_airf_array[i, :] .= panel.z_airf solver.sol.va_array[i, :] .= panel.va - chord_array[i] = panel.chord + solver.sol.chord_array[i] = panel.chord end # Calculate unit vectors @@ -372,7 +372,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut body_aero, gamma_initial, solver.sol.va_array, - chord_array, + solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, @@ -388,7 +388,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut body_aero, gamma_initial, solver.sol.va_array, - chord_array, + solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, @@ -410,7 +410,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver.mu, alpha_array, v_a_array, - chord_array, + solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, From a9f4309d72458175b22aeccde4f55a0c7e36498d Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 19:47:47 +0100 Subject: [PATCH 24/85] Change comment --- src/solver.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solver.jl b/src/solver.jl index 3efedc81..b3657f07 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -323,7 +323,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut alpha_array = body_aero.alpha_array relaxation_factor = solver.relaxation_factor - # Preallocate arrays + # Clear arrays solver.sol.x_airf_array .= 0 solver.sol.y_airf_array .= 0 solver.sol.z_airf_array .= 0 From 709fae2ad422cad33a78570521dea7fe4233bce1 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 20:02:43 +0100 Subject: [PATCH 25/85] Cleanup --- src/body_aerodynamics.jl | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 65157c6d..fff2322b 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -476,37 +476,6 @@ function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, return alpha_array end -# function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, -# gamma::Vector{Float64}, -# core_radius_fraction::Float64, -# z_airf_array::Matrix{Float64}, -# x_airf_array::Matrix{Float64}, -# va_array::Matrix{Float64}, -# va_norm_array::Vector{Float64}, -# va_unit_array::Matrix{Float64}) - -# # Calculate AIC matrices at aerodynamic center using LLT method -# calculate_AIC_matrices!( -# body_aero, LLT, core_radius_fraction, va_norm_array, va_unit_array -# ) -# AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] - -# # Calculate induced velocities -# induced_velocity = [ -# AIC_x * gamma, -# AIC_y * gamma, -# AIC_z * gamma -# ] -# induced_velocity = hcat(induced_velocity...) - -# # Calculate relative velocities and angles -# relative_velocity = va_array + induced_velocity -# v_normal = sum(z_airf_array .* relative_velocity, dims=2) -# v_tangential = sum(x_airf_array .* relative_velocity, dims=2) -# alpha_array = atan.(v_normal ./ v_tangential) -# return alpha_array -# end - """ calculate_results(body_aero::BodyAerodynamics, gamma_new::Vector{Float64}, density::Float64, aerodynamic_model_type::Model, From e529b191ac68f62688551a68c728d17a4a6510eb Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 22:19:57 +0100 Subject: [PATCH 26/85] Add PreallocationTools --- Project.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Project.toml b/Project.toml index 4078d9f0..f21c0145 100644 --- a/Project.toml +++ b/Project.toml @@ -15,6 +15,7 @@ Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e" NonlinearSolve = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +PreallocationTools = "d236fae5-4411-538c-8e31-a6e3d9e00b46" Serialization = "9e88b42a-f829-5b0c-bbe9-9e923198166b" SharedArrays = "1a1011a3-84de-559e-8e89-a11a2f7dc383" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" @@ -47,6 +48,7 @@ Measures = "0.3" NonlinearSolve = "4" Parameters = "0.12" Pkg = "1" +PreallocationTools = "0.4.25" Serialization = "1" SharedArrays = "1" StaticArrays = "1" From 361093dd5e5199e7dd2290facf9bff909503b7da Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 22:20:11 +0100 Subject: [PATCH 27/85] Now 408 allocations --- src/VortexStepMethod.jl | 1 + src/solver.jl | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/VortexStepMethod.jl b/src/VortexStepMethod.jl index 7f5a3d04..4602bd55 100644 --- a/src/VortexStepMethod.jl +++ b/src/VortexStepMethod.jl @@ -15,6 +15,7 @@ using Interpolations: Extrapolation using Parameters using Serialization using SharedArrays +using PreallocationTools using Pkg # Export public interface diff --git a/src/solver.jl b/src/solver.jl index b3657f07..334ed326 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -96,6 +96,12 @@ sol::VSMSolution = VSMSolution(): The result of calling [solve!](@ref) sol::VSMSolution{P} = VSMSolution(P) end +const cache = LazyBufferCache() +const cache2 = LazyBufferCache() +const cache3 = LazyBufferCache() +const cache4 = LazyBufferCache() +const cache5 = LazyBufferCache() + """ solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=solver.sol.gamma_distribution; log=false, reference_point=zeros(MVec3), moment_frac=0.1) @@ -450,14 +456,14 @@ function gamma_loop( n_panels = length(body_aero.panels) alpha_array = body_aero.alpha_array v_a_array = body_aero.v_a_array - Umagw_array = similar(v_a_array) + Umagw_array = cache[v_a_array] - gamma = copy(gamma_new) - abs_gamma_new = copy(gamma_new) + gamma = cache2[gamma_new] + abs_gamma_new = cache3[gamma_new] induced_velocity_all = zeros(n_panels, 3) - relative_velocity_array = similar(va_array) - relative_velocity_crossz = similar(relative_velocity_array) - v_acrossz_array = similar(va_array) + relative_velocity_array = cache[va_array] + relative_velocity_crossz = cache4[relative_velocity_array] + v_acrossz_array = cache5[va_array] cl_array = zeros(n_panels) damp = zeros(length(gamma)) v_normal_array = zeros(n_panels) From 37a506ff60126150c17c1d4929ea9834d0a64aa3 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Tue, 18 Mar 2025 22:57:07 +0100 Subject: [PATCH 28/85] Now 398 allocations --- src/solver.jl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 334ed326..b64810e1 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -101,6 +101,8 @@ const cache2 = LazyBufferCache() const cache3 = LazyBufferCache() const cache4 = LazyBufferCache() const cache5 = LazyBufferCache() +const cache6 = LazyBufferCache() +const cache7 = LazyBufferCache() """ solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=solver.sol.gamma_distribution; @@ -460,14 +462,14 @@ function gamma_loop( gamma = cache2[gamma_new] abs_gamma_new = cache3[gamma_new] - induced_velocity_all = zeros(n_panels, 3) + induced_velocity_all = cache6[va_array] relative_velocity_array = cache[va_array] relative_velocity_crossz = cache4[relative_velocity_array] v_acrossz_array = cache5[va_array] - cl_array = zeros(n_panels) - damp = zeros(length(gamma)) - v_normal_array = zeros(n_panels) - v_tangential_array = zeros(n_panels) + cl_array = cache3[gamma] + damp = cache3[cl_array] + v_normal_array = cache3[damp] + v_tangential_array = cache7[v_normal_array] AIC_x, AIC_y, AIC_z = body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] From 50ebc19f91c57891d6c4ce845df5143ad4db1d91 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 04:14:41 +0100 Subject: [PATCH 29/85] Refactoring --- src/solver.jl | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index b64810e1..69b87f39 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -96,13 +96,9 @@ sol::VSMSolution = VSMSolution(): The result of calling [solve!](@ref) sol::VSMSolution{P} = VSMSolution(P) end -const cache = LazyBufferCache() -const cache2 = LazyBufferCache() -const cache3 = LazyBufferCache() -const cache4 = LazyBufferCache() -const cache5 = LazyBufferCache() -const cache6 = LazyBufferCache() -const cache7 = LazyBufferCache() +const cache = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), + LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), + LazyBufferCache(), LazyBufferCache(), LazyBufferCache()] """ solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=solver.sol.gamma_distribution; @@ -454,22 +450,22 @@ function gamma_loop( relaxation_factor::Float64; log::Bool = true ) - converged = false - n_panels = length(body_aero.panels) + converged = false + n_panels = length(body_aero.panels) alpha_array = body_aero.alpha_array - v_a_array = body_aero.v_a_array - Umagw_array = cache[v_a_array] - - gamma = cache2[gamma_new] - abs_gamma_new = cache3[gamma_new] - induced_velocity_all = cache6[va_array] - relative_velocity_array = cache[va_array] - relative_velocity_crossz = cache4[relative_velocity_array] - v_acrossz_array = cache5[va_array] - cl_array = cache3[gamma] - damp = cache3[cl_array] - v_normal_array = cache3[damp] - v_tangential_array = cache7[v_normal_array] + v_a_array = body_aero.v_a_array + Umagw_array = cache[1][v_a_array] + + gamma = cache[2][gamma_new] + abs_gamma_new = cache[3][gamma_new] + induced_velocity_all = cache[4][va_array] + relative_velocity_array = cache[5][va_array] + relative_velocity_crossz = cache[6][relative_velocity_array] + v_acrossz_array = cache[7][va_array] + cl_array = cache[8][gamma] + damp = cache[9][cl_array] + v_normal_array = cache[10][damp] + v_tangential_array = cache[11][v_normal_array] AIC_x, AIC_y, AIC_z = body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] From b4261034a0e791c0f20e0591af41e891beb661a6 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 04:29:36 +0100 Subject: [PATCH 30/85] Refactoring --- src/solver.jl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 69b87f39..50097b2f 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -126,7 +126,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # calculate intermediate result (converged, body_aero, gamma_new, reference_point, density, aerodynamic_model_type, core_radius_fraction, - mu, alpha_array, v_a_array, solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, + mu, alpha_array, v_a_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, solver.sol.va_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output) = solve_base(solver, body_aero, gamma_distribution; log, reference_point) if !isnothing(solver.sol.gamma_distribution) @@ -288,7 +288,7 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n # calculate intermediate result converged, body_aero, gamma_new, reference_point, density, aerodynamic_model_type, core_radius_fraction, - mu, alpha_array, v_a_array, chord_array, x_airf_array, y_airf_array, z_airf_array, + mu, alpha_array, v_a_array, x_airf_array, y_airf_array, z_airf_array, va_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output = solve_base(solver, body_aero, gamma_distribution; log, reference_point) @@ -303,7 +303,7 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n mu, alpha_array, v_a_array, - chord_array, + solver.sol.chord_array, x_airf_array, y_airf_array, z_airf_array, @@ -414,7 +414,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver.mu, alpha_array, v_a_array, - solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, From 8909fce16ac6f6688b7e5464b3018c773c6b4d4f Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 04:49:55 +0100 Subject: [PATCH 31/85] Refactoring --- src/solver.jl | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 50097b2f..271cb439 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -126,8 +126,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # calculate intermediate result (converged, body_aero, gamma_new, reference_point, density, aerodynamic_model_type, core_radius_fraction, - mu, alpha_array, v_a_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, - solver.sol.va_array, va_norm_array, va_unit_array, panels, + mu, alpha_array, v_a_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output) = solve_base(solver, body_aero, gamma_distribution; log, reference_point) if !isnothing(solver.sol.gamma_distribution) solver.sol.gamma_distribution .= gamma_new @@ -288,8 +287,7 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n # calculate intermediate result converged, body_aero, gamma_new, reference_point, density, aerodynamic_model_type, core_radius_fraction, - mu, alpha_array, v_a_array, x_airf_array, y_airf_array, z_airf_array, - va_array, va_norm_array, va_unit_array, panels, + mu, alpha_array, v_a_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output = solve_base(solver, body_aero, gamma_distribution; log, reference_point) # Calculate final results as dictionary @@ -304,10 +302,10 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n alpha_array, v_a_array, solver.sol.chord_array, - x_airf_array, - y_airf_array, - z_airf_array, - va_array, + solver.sol.x_airf_array, + solver.sol.y_airf_array, + solver.sol.z_airf_array, + solver.sol.va_array, va_norm_array, va_unit_array, panels, @@ -414,10 +412,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut solver.mu, alpha_array, v_a_array, - solver.sol.x_airf_array, - solver.sol.y_airf_array, - solver.sol.z_airf_array, - solver.sol.va_array, va_norm_array, va_unit_array, panels, From 01411223513556e615d5979902273149c2ec5f85 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 05:06:33 +0100 Subject: [PATCH 32/85] Refactoring --- src/solver.jl | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 271cb439..329cbe75 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -478,14 +478,10 @@ function gamma_loop( relative_velocity_array .= va_array .+ induced_velocity_all for i in 1:n_panels - relative_velocity_crossz[i, :] .= cross3( - view(relative_velocity_array, i, :), - view(y_airf_array, i, :) - ) - v_acrossz_array[i, :] .= cross3( - view(va_array, i, :), - view(y_airf_array, i, :) - ) + relative_velocity_crossz[i, :] .= MVec3(view(relative_velocity_array, i, :)) × + MVec3(view(y_airf_array, i, :)) + v_acrossz_array[i, :] .= MVec3(view(va_array, i, :)) × + MVec3(view(y_airf_array, i, :)) end for i in 1:n_panels From 431437836bcba9094f1276e22a5428fe130f9916 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 05:08:55 +0100 Subject: [PATCH 33/85] Cleanup --- src/solver.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 329cbe75..fec6ddce 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -419,8 +419,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut ) end -cross3(x,y) = SVector{3,eltype(x)}(x) × SVector{3,eltype(y)}(y) - """ gamma_loop(solver::Solver, gamma_new::Vector{Float64}, AIC_x::Matrix{Float64}, AIC_y::Matrix{Float64}, AIC_z::Matrix{Float64}, va_array::Matrix{Float64}, From 36fc83638d990f106b0c407c3ce3b3b88c5c3170 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 05:55:35 +0100 Subject: [PATCH 34/85] Refactoring --- src/solver.jl | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index fec6ddce..b04da7ad 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -45,6 +45,13 @@ function VSMSolution(P) VSMSolution{P}() end +struct LoopResult + converged::Bool + gamma_new::Vector{Float64} + alpha_array::Vector{Float64} + v_a_array::Vector{Float64} +end + """ Solver @@ -125,7 +132,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - (converged, body_aero, gamma_new, reference_point, density, aerodynamic_model_type, core_radius_fraction, + (converged, body_aero, gamma_new, reference_point, aerodynamic_model_type, core_radius_fraction, mu, alpha_array, v_a_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output) = solve_base(solver, body_aero, gamma_distribution; log, reference_point) if !isnothing(solver.sol.gamma_distribution) @@ -135,7 +142,6 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= end # Initialize arrays - n_panels = length(panels) cl_array = solver.sol.cl_array cd_array = solver.sol.cd_array cm_array = solver.sol.cm_array @@ -144,6 +150,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= solver.sol.moment_coefficient_distribution .= 0 moment_distribution = solver.sol.moment_distribution moment_coefficient_distribution = solver.sol.moment_coefficient_distribution + density = solver.density # Calculate coefficients for each panel for (i, panel) in enumerate(panels) # zero bytes @@ -286,7 +293,7 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n log=false, reference_point=zeros(MVec3)) # calculate intermediate result converged, - body_aero, gamma_new, reference_point, density, aerodynamic_model_type, core_radius_fraction, + body_aero, gamma_new, reference_point, aerodynamic_model_type, core_radius_fraction, mu, alpha_array, v_a_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output = solve_base(solver, body_aero, gamma_distribution; log, reference_point) @@ -295,7 +302,7 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n body_aero, gamma_new, reference_point, - density, + solver.density, aerodynamic_model_type, core_radius_fraction, mu, @@ -406,7 +413,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut body_aero, gamma_new, reference_point, - solver.density, solver.aerodynamic_model_type, solver.core_radius_fraction, solver.mu, From 2d7b02d0c5d4e1e7305e53a1a7a0c5ff2f9716a7 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 06:00:14 +0100 Subject: [PATCH 35/85] Refactoring --- src/solver.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index b04da7ad..8bbed194 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -132,7 +132,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - (converged, body_aero, gamma_new, reference_point, aerodynamic_model_type, core_radius_fraction, + (converged, body_aero, gamma_new, reference_point, core_radius_fraction, mu, alpha_array, v_a_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output) = solve_base(solver, body_aero, gamma_distribution; log, reference_point) if !isnothing(solver.sol.gamma_distribution) @@ -151,6 +151,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= moment_distribution = solver.sol.moment_distribution moment_coefficient_distribution = solver.sol.moment_coefficient_distribution density = solver.density + aerodynamic_model_type = solver.aerodynamic_model_type # Calculate coefficients for each panel for (i, panel) in enumerate(panels) # zero bytes @@ -293,7 +294,7 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n log=false, reference_point=zeros(MVec3)) # calculate intermediate result converged, - body_aero, gamma_new, reference_point, aerodynamic_model_type, core_radius_fraction, + body_aero, gamma_new, reference_point, core_radius_fraction, mu, alpha_array, v_a_array, va_norm_array, va_unit_array, panels, is_only_f_and_gamma_output = solve_base(solver, body_aero, gamma_distribution; log, reference_point) @@ -303,7 +304,7 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n gamma_new, reference_point, solver.density, - aerodynamic_model_type, + solver.aerodynamic_model_type, core_radius_fraction, mu, alpha_array, @@ -413,7 +414,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut body_aero, gamma_new, reference_point, - solver.aerodynamic_model_type, solver.core_radius_fraction, solver.mu, alpha_array, From a016eee32d329b554ec981fdaa08c341171f7c54 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 06:42:18 +0100 Subject: [PATCH 36/85] Update comment --- src/solver.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solver.jl b/src/solver.jl index 8bbed194..f5d2ab3a 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -200,7 +200,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Calculate wing geometry properties projected_area = body_aero.projected_area - for (i, panel) in enumerate(panels) # 30625 bytes + for (i, panel) in enumerate(panels) # 8008 bytes ### Lift and Drag ### # Panel geometry From f9d9531ce0bce8f31984006a92525609db6e2820 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 07:04:19 +0100 Subject: [PATCH 37/85] Now 394 allocations --- src/solver.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index f5d2ab3a..0e2bc10e 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -249,16 +249,16 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= end # update the result struct - solver.sol.aero_force .= [ + solver.sol.aero_force .= MVec3( sum(solver.sol.f_body_3D[1,:]), sum(solver.sol.f_body_3D[2,:]), sum(solver.sol.f_body_3D[3,:]) - ] - solver.sol.aero_moments .= [ + ) + solver.sol.aero_moments .= MVec3( sum(solver.sol.m_body_3D[1,:]), sum(solver.sol.m_body_3D[2,:]), sum(solver.sol.m_body_3D[3,:]) - ] + ) solver.sol.force_coefficients .= solver.sol.aero_force ./ (q_inf * projected_area) solver.sol.moment_coefficients .= solver.sol.aero_moments ./ (q_inf * projected_area) if converged From 63c3bfa8673262f196aba72e9669177ad1d9cb6e Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 07:30:59 +0100 Subject: [PATCH 38/85] Refactoring --- src/solver.jl | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 0e2bc10e..bbf127a1 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -132,9 +132,9 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - (converged, body_aero, gamma_new, reference_point, core_radius_fraction, - mu, alpha_array, v_a_array, va_norm_array, va_unit_array, panels, - is_only_f_and_gamma_output) = solve_base(solver, body_aero, gamma_distribution; log, reference_point) + converged, body_aero, gamma_new, reference_point, alpha_array, v_a_array, va_norm_array, + va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; + log, reference_point) if !isnothing(solver.sol.gamma_distribution) solver.sol.gamma_distribution .= gamma_new else @@ -176,7 +176,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= update_effective_angle_of_attack_if_VSM( body_aero, gamma_new, - core_radius_fraction, + solver.core_radius_fraction, solver.sol.z_airf_array, solver.sol.x_airf_array, solver.sol.va_array, @@ -293,10 +293,9 @@ A dictionary with the results. function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) # calculate intermediate result - converged, - body_aero, gamma_new, reference_point, core_radius_fraction, - mu, alpha_array, v_a_array, va_norm_array, va_unit_array, panels, - is_only_f_and_gamma_output = solve_base(solver, body_aero, gamma_distribution; log, reference_point) + converged, body_aero, gamma_new, reference_point, alpha_array, v_a_array, va_norm_array, + va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; + log, reference_point) # Calculate final results as dictionary results = calculate_results( @@ -305,8 +304,8 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n reference_point, solver.density, solver.aerodynamic_model_type, - core_radius_fraction, - mu, + solver.core_radius_fraction, + solver.mu, alpha_array, v_a_array, solver.sol.chord_array, @@ -317,7 +316,7 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n va_norm_array, va_unit_array, panels, - is_only_f_and_gamma_output + solver.is_only_f_and_gamma_output ) return results end @@ -414,14 +413,11 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut body_aero, gamma_new, reference_point, - solver.core_radius_fraction, - solver.mu, alpha_array, v_a_array, va_norm_array, va_unit_array, - panels, - solver.is_only_f_and_gamma_output + panels ) end From 31830a750c8ba9857a6de80a787a8a766b2fa64d Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 07:34:13 +0100 Subject: [PATCH 39/85] Add BaseResult --- src/solver.jl | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/solver.jl b/src/solver.jl index bbf127a1..93be532c 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -52,6 +52,18 @@ struct LoopResult v_a_array::Vector{Float64} end +struct BaseResult + converged + body_aero + gamma_new + reference_point + alpha_array + v_a_array + va_norm_array + va_unit_array + panels +end + """ Solver From 635ba3e2b6f127e57c8e03d6754025c5336c62f4 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 13:41:16 +0100 Subject: [PATCH 40/85] Improve LoopResult --- src/solver.jl | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 93be532c..e8146d23 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -45,11 +45,15 @@ function VSMSolution(P) VSMSolution{P}() end -struct LoopResult - converged::Bool - gamma_new::Vector{Float64} - alpha_array::Vector{Float64} - v_a_array::Vector{Float64} +@with_kw struct LoopResult{P} + converged::Bool = false + gamma_new::Vector{Float64} = zeros(P) + alpha_array::Vector{Float64} = zeros(P) + v_a_array::Vector{Float64} = zeros(P) +end + +function LoopResult(P) + LoopResult{P}() end struct BaseResult @@ -465,11 +469,11 @@ function gamma_loop( abs_gamma_new = cache[3][gamma_new] induced_velocity_all = cache[4][va_array] relative_velocity_array = cache[5][va_array] - relative_velocity_crossz = cache[6][relative_velocity_array] + relative_velocity_crossz = cache[6][va_array] v_acrossz_array = cache[7][va_array] cl_array = cache[8][gamma] damp = cache[9][cl_array] - v_normal_array = cache[10][damp] + v_normal_array = cache[10][cl_array] v_tangential_array = cache[11][v_normal_array] AIC_x, AIC_y, AIC_z = body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] From d391ba5b771f4975d99ddfc7ea160914b3ab1950 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 14:25:43 +0100 Subject: [PATCH 41/85] Refactoring, use LoopResult --- src/solver.jl | 64 ++++++++++++++++++++++++++------------------------- test/bench.jl | 5 ++-- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index e8146d23..03da38f0 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -45,7 +45,7 @@ function VSMSolution(P) VSMSolution{P}() end -@with_kw struct LoopResult{P} +@with_kw mutable struct LoopResult{P} converged::Bool = false gamma_new::Vector{Float64} = zeros(P) alpha_array::Vector{Float64} = zeros(P) @@ -115,6 +115,9 @@ sol::VSMSolution = VSMSolution(): The result of calling [solve!](@ref) mu::Float64 = 1.81e-5 is_only_f_and_gamma_output::Bool = false + # Intermediate results + lr::LoopResult{P} = LoopResult(P) + # Solution sol::VSMSolution{P} = VSMSolution(P) end @@ -391,11 +394,11 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut end @debug "Initial gamma_new: $gamma_initial" + solver.lr.gamma_new .= gamma_initial # Run main iteration loop - converged, gamma_new, alpha_array, v_a_array = gamma_loop( + gamma_loop!( solver, body_aero, - gamma_initial, solver.sol.va_array, solver.sol.chord_array, solver.sol.x_airf_array, @@ -406,12 +409,12 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut log ) # Try again with reduced relaxation factor if not converged - if !converged && relaxation_factor > 1e-3 + if ! solver.lr.converged && relaxation_factor > 1e-3 log && @warn "Running again with half the relaxation_factor = $(relaxation_factor/2)" - converged, gamma_new, alpha_array, v_a_array = gamma_loop( + solver.lr.gamma_new .= gamma_initial + gamma_loop!( solver, body_aero, - gamma_initial, solver.sol.va_array, solver.sol.chord_array, solver.sol.x_airf_array, @@ -425,12 +428,12 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut # Return results return ( - converged, + solver.lr.converged, body_aero, - gamma_new, + solver.lr.gamma_new, reference_point, - alpha_array, - v_a_array, + solver.lr.alpha_array, + solver.lr.v_a_array, va_norm_array, va_unit_array, panels @@ -438,7 +441,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut end """ - gamma_loop(solver::Solver, gamma_new::Vector{Float64}, AIC_x::Matrix{Float64}, + gamma_loop!(solver::Solver, AIC_x::Matrix{Float64}, AIC_y::Matrix{Float64}, AIC_z::Matrix{Float64}, va_array::Matrix{Float64}, chord_array::Vector{Float64}, x_airf_array::Matrix{Float64}, y_airf_array::Matrix{Float64}, z_airf_array::Matrix{Float64}, @@ -446,10 +449,9 @@ end Main iteration loop for calculating circulation distribution. """ -function gamma_loop( +function gamma_loop!( solver::Solver, body_aero::BodyAerodynamics, - gamma_new::Vector{Float64}, va_array::Matrix{Float64}, chord_array::Vector{Float64}, x_airf_array::Matrix{Float64}, @@ -459,14 +461,14 @@ function gamma_loop( relaxation_factor::Float64; log::Bool = true ) - converged = false + solver.lr.converged = false n_panels = length(body_aero.panels) - alpha_array = body_aero.alpha_array - v_a_array = body_aero.v_a_array - Umagw_array = cache[1][v_a_array] + solver.lr.alpha_array .= body_aero.alpha_array + solver.lr.v_a_array .= body_aero.v_a_array + Umagw_array = cache[1][solver.lr.v_a_array] - gamma = cache[2][gamma_new] - abs_gamma_new = cache[3][gamma_new] + gamma = cache[2][solver.lr.gamma_new] + abs_gamma_new = cache[3][solver.lr.gamma_new] induced_velocity_all = cache[4][va_array] relative_velocity_array = cache[5][va_array] relative_velocity_crossz = cache[6][va_array] @@ -485,7 +487,7 @@ function gamma_loop( iters = 0 for i in 1:solver.max_iterations iters += 1 - gamma .= gamma_new + gamma .= solver.lr.gamma_new # Calculate induced velocities mul!(velocity_view_x, AIC_x, gamma) @@ -504,17 +506,17 @@ function gamma_loop( v_normal_array[i] = view(z_airf_array, i, :) ⋅ view(relative_velocity_array, i, :) v_tangential_array[i] = view(x_airf_array, i, :) ⋅ view(relative_velocity_array, i, :) end - alpha_array .= atan.(v_normal_array, v_tangential_array) + solver.lr.alpha_array .= atan.(v_normal_array, v_tangential_array) for i in 1:n_panels - @views v_a_array[i] = norm(relative_velocity_crossz[i, :]) + @views solver.lr.v_a_array[i] = norm(relative_velocity_crossz[i, :]) @views Umagw_array[i] = norm(v_acrossz_array[i, :]) end - for (i, (panel, alpha)) in enumerate(zip(panels, alpha_array)) + for (i, (panel, alpha)) in enumerate(zip(panels, solver.lr.alpha_array)) cl_array[i] = calculate_cl(panel, alpha) end - gamma_new .= 0.5 .* v_a_array.^2 ./ Umagw_array .* cl_array .* chord_array + solver.lr.gamma_new .= 0.5 .* solver.lr.v_a_array.^2 ./ Umagw_array .* cl_array .* chord_array # Apply damping if needed if solver.is_with_artificial_damping @@ -525,32 +527,32 @@ function gamma_loop( is_damping_applied = false end # Update gamma with relaxation and damping - gamma_new .= (1 - relaxation_factor) .* gamma .+ - relaxation_factor .* gamma_new .+ damp + solver.lr.gamma_new .= (1 - relaxation_factor) .* gamma .+ + relaxation_factor .* solver.lr.gamma_new .+ damp # Check convergence - abs_gamma_new .= abs.(gamma_new) + abs_gamma_new .= abs.(solver.lr.gamma_new) reference_error = maximum(abs_gamma_new) reference_error = max(reference_error, solver.tol_reference_error) - abs_gamma_new .= abs.(gamma_new .- gamma) + abs_gamma_new .= abs.(solver.lr.gamma_new .- gamma) error = maximum(abs_gamma_new) normalized_error = error / reference_error @debug "Iteration: $i, normalized_error: $normalized_error, is_damping_applied: $is_damping_applied" if normalized_error < solver.allowed_error - converged = true + solver.lr.converged = true break end end - if log && converged + if log && solver.lr.converged @info "Converged after $iters iterations" elseif log @warn "NO convergence after $(solver.max_iterations) iterations" end - return converged, gamma_new, alpha_array, v_a_array + nothing end """ diff --git a/test/bench.jl b/test/bench.jl index e267d672..3f257dc6 100644 --- a/test/bench.jl +++ b/test/bench.jl @@ -6,7 +6,7 @@ end using BenchmarkTools using StaticArrays using VortexStepMethod -using VortexStepMethod: calculate_AIC_matrices!, gamma_loop, calculate_results, +using VortexStepMethod: calculate_AIC_matrices!, gamma_loop!, calculate_results, update_effective_angle_of_attack_if_VSM, calculate_projected_area, calculate_cl, calculate_cd_cm, calculate_velocity_induced_single_ring_semiinfinite!, @@ -118,10 +118,9 @@ using LinearAlgebra solver = Solver{P}( aerodynamic_model_type=model ) - result = @benchmark gamma_loop( + result = @benchmark gamma_loop!( $solver, $body_aero, - $gamma_new, $va_array, $chord_array, $x_airf_array, From 667596923ef458f1616d70093046c1c90ba222fa Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 14:27:14 +0100 Subject: [PATCH 42/85] Refactoring --- src/solver.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 03da38f0..be374989 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -465,7 +465,7 @@ function gamma_loop!( n_panels = length(body_aero.panels) solver.lr.alpha_array .= body_aero.alpha_array solver.lr.v_a_array .= body_aero.v_a_array - Umagw_array = cache[1][solver.lr.v_a_array] + va_magw_array = cache[1][solver.lr.v_a_array] gamma = cache[2][solver.lr.gamma_new] abs_gamma_new = cache[3][solver.lr.gamma_new] @@ -510,13 +510,13 @@ function gamma_loop!( for i in 1:n_panels @views solver.lr.v_a_array[i] = norm(relative_velocity_crossz[i, :]) - @views Umagw_array[i] = norm(v_acrossz_array[i, :]) + @views va_magw_array[i] = norm(v_acrossz_array[i, :]) end for (i, (panel, alpha)) in enumerate(zip(panels, solver.lr.alpha_array)) cl_array[i] = calculate_cl(panel, alpha) end - solver.lr.gamma_new .= 0.5 .* solver.lr.v_a_array.^2 ./ Umagw_array .* cl_array .* chord_array + solver.lr.gamma_new .= 0.5 .* solver.lr.v_a_array.^2 ./ va_magw_array .* cl_array .* chord_array # Apply damping if needed if solver.is_with_artificial_damping From 8cbcae98f6575b23913a6edec6ed4e20926f5e6a Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 14:29:12 +0100 Subject: [PATCH 43/85] Add comment --- src/solver.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solver.jl b/src/solver.jl index be374989..f05eb117 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -48,7 +48,7 @@ end @with_kw mutable struct LoopResult{P} converged::Bool = false gamma_new::Vector{Float64} = zeros(P) - alpha_array::Vector{Float64} = zeros(P) + alpha_array::Vector{Float64} = zeros(P) # TODO: Is this different from BodyAerodynamics.alpha_array ? v_a_array::Vector{Float64} = zeros(P) end From dc856092766696db73744e1b167510139537d41f Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 14:41:28 +0100 Subject: [PATCH 44/85] Refactoring --- src/solver.jl | 5 ++--- test/bench.jl | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index f05eb117..3b01d2d2 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -45,6 +45,7 @@ function VSMSolution(P) VSMSolution{P}() end +# Output of the function gamma_loop! @with_kw mutable struct LoopResult{P} converged::Bool = false gamma_new::Vector{Float64} = zeros(P) @@ -399,7 +400,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut gamma_loop!( solver, body_aero, - solver.sol.va_array, solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, @@ -415,7 +415,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut gamma_loop!( solver, body_aero, - solver.sol.va_array, solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, @@ -452,7 +451,6 @@ Main iteration loop for calculating circulation distribution. function gamma_loop!( solver::Solver, body_aero::BodyAerodynamics, - va_array::Matrix{Float64}, chord_array::Vector{Float64}, x_airf_array::Matrix{Float64}, y_airf_array::Matrix{Float64}, @@ -461,6 +459,7 @@ function gamma_loop!( relaxation_factor::Float64; log::Bool = true ) + va_array = solver.sol.va_array solver.lr.converged = false n_panels = length(body_aero.panels) solver.lr.alpha_array .= body_aero.alpha_array diff --git a/test/bench.jl b/test/bench.jl index 3f257dc6..21a7f670 100644 --- a/test/bench.jl +++ b/test/bench.jl @@ -118,10 +118,10 @@ using LinearAlgebra solver = Solver{P}( aerodynamic_model_type=model ) + solver.sol.va_array .= va_array result = @benchmark gamma_loop!( $solver, $body_aero, - $va_array, $chord_array, $x_airf_array, $y_airf_array, From 4aefd86391f68d3975606334afca6a8bb1944b5a Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 14:45:49 +0100 Subject: [PATCH 45/85] Refactoring --- src/solver.jl | 4 +--- test/bench.jl | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 3b01d2d2..bcce5539 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -400,7 +400,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut gamma_loop!( solver, body_aero, - solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, @@ -415,7 +414,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut gamma_loop!( solver, body_aero, - solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, solver.sol.z_airf_array, @@ -451,7 +449,6 @@ Main iteration loop for calculating circulation distribution. function gamma_loop!( solver::Solver, body_aero::BodyAerodynamics, - chord_array::Vector{Float64}, x_airf_array::Matrix{Float64}, y_airf_array::Matrix{Float64}, z_airf_array::Matrix{Float64}, @@ -460,6 +457,7 @@ function gamma_loop!( log::Bool = true ) va_array = solver.sol.va_array + chord_array = solver.sol.chord_array solver.lr.converged = false n_panels = length(body_aero.panels) solver.lr.alpha_array .= body_aero.alpha_array diff --git a/test/bench.jl b/test/bench.jl index 21a7f670..5e0d32c0 100644 --- a/test/bench.jl +++ b/test/bench.jl @@ -119,10 +119,10 @@ using LinearAlgebra aerodynamic_model_type=model ) solver.sol.va_array .= va_array + solver.sol.chord_array .= chord_array result = @benchmark gamma_loop!( $solver, $body_aero, - $chord_array, $x_airf_array, $y_airf_array, $z_airf_array, From 52b8b456442f99eeae15dd12cd0796b169b7ee94 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 14:46:53 +0100 Subject: [PATCH 46/85] Update docstring --- src/solver.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index bcce5539..7fe7ea00 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -439,8 +439,8 @@ end """ gamma_loop!(solver::Solver, AIC_x::Matrix{Float64}, - AIC_y::Matrix{Float64}, AIC_z::Matrix{Float64}, va_array::Matrix{Float64}, - chord_array::Vector{Float64}, x_airf_array::Matrix{Float64}, + AIC_y::Matrix{Float64}, AIC_z::Matrix{Float64}, + x_airf_array::Matrix{Float64}, y_airf_array::Matrix{Float64}, z_airf_array::Matrix{Float64}, panels::Vector{Panel}, relaxation_factor::Float64; log=true) From 40b225d1a86bb31fd4779ce02b04610b275b0d57 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 14:56:11 +0100 Subject: [PATCH 47/85] Refactoring --- src/solver.jl | 30 +++++------------------------- test/bench.jl | 8 ++++---- 2 files changed, 9 insertions(+), 29 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 7fe7ea00..11cb7295 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -397,30 +397,12 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut @debug "Initial gamma_new: $gamma_initial" solver.lr.gamma_new .= gamma_initial # Run main iteration loop - gamma_loop!( - solver, - body_aero, - solver.sol.x_airf_array, - solver.sol.y_airf_array, - solver.sol.z_airf_array, - panels, - relaxation_factor; - log - ) + gamma_loop!(solver, body_aero, panels, relaxation_factor; log) # Try again with reduced relaxation factor if not converged if ! solver.lr.converged && relaxation_factor > 1e-3 log && @warn "Running again with half the relaxation_factor = $(relaxation_factor/2)" solver.lr.gamma_new .= gamma_initial - gamma_loop!( - solver, - body_aero, - solver.sol.x_airf_array, - solver.sol.y_airf_array, - solver.sol.z_airf_array, - panels, - relaxation_factor/2; - log - ) + gamma_loop!(solver, body_aero, panels, relaxation_factor/2; log) end # Return results @@ -440,8 +422,6 @@ end """ gamma_loop!(solver::Solver, AIC_x::Matrix{Float64}, AIC_y::Matrix{Float64}, AIC_z::Matrix{Float64}, - x_airf_array::Matrix{Float64}, - y_airf_array::Matrix{Float64}, z_airf_array::Matrix{Float64}, panels::Vector{Panel}, relaxation_factor::Float64; log=true) Main iteration loop for calculating circulation distribution. @@ -449,15 +429,15 @@ Main iteration loop for calculating circulation distribution. function gamma_loop!( solver::Solver, body_aero::BodyAerodynamics, - x_airf_array::Matrix{Float64}, - y_airf_array::Matrix{Float64}, - z_airf_array::Matrix{Float64}, panels::Vector{Panel}, relaxation_factor::Float64; log::Bool = true ) va_array = solver.sol.va_array chord_array = solver.sol.chord_array + x_airf_array = solver.sol.x_airf_array + y_airf_array = solver.sol.y_airf_array + z_airf_array = solver.sol.z_airf_array solver.lr.converged = false n_panels = length(body_aero.panels) solver.lr.alpha_array .= body_aero.alpha_array diff --git a/test/bench.jl b/test/bench.jl index 5e0d32c0..3351e79b 100644 --- a/test/bench.jl +++ b/test/bench.jl @@ -120,17 +120,17 @@ using LinearAlgebra ) solver.sol.va_array .= va_array solver.sol.chord_array .= chord_array + solver.sol.x_airf_array .= x_airf_array + solver.sol.y_airf_array .= y_airf_array + solver.sol.z_airf_array .= z_airf_array result = @benchmark gamma_loop!( $solver, $body_aero, - $x_airf_array, - $y_airf_array, - $z_airf_array, $body_aero.panels, 0.5; log = false ) samples = 1 evals = 1 - @test result.allocs ≤ 100 + @test result.allocs ≤ 10 @info "Model: $model \t Aero_model: $aero_model \t Allocations: $(result.allocs) Memory: $(result.memory)" end end From bdfb10463b603f899e2cef339f8f093b23bad4e5 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 15:02:46 +0100 Subject: [PATCH 48/85] Cleanup --- src/solver.jl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 11cb7295..7ce1eb33 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -349,7 +349,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut # Initialize variables panels = body_aero.panels n_panels = length(panels) - alpha_array = body_aero.alpha_array relaxation_factor = solver.relaxation_factor # Clear arrays @@ -373,13 +372,8 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut va_unit_array = solver.sol.va_array ./ va_norm_array # Calculate AIC matrices - calculate_AIC_matrices!( - body_aero, - solver.aerodynamic_model_type, - solver.core_radius_fraction, - va_norm_array, - va_unit_array - ) + calculate_AIC_matrices!(body_aero, solver.aerodynamic_model_type, solver.core_radius_fraction, va_norm_array, + va_unit_array) # Initialize gamma distribution gamma_initial = if isnothing(gamma_distribution) From ef597d227da21e05626d9b64257eb7478008a90d Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 15:33:07 +0100 Subject: [PATCH 49/85] Refactoring --- src/solver.jl | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 7ce1eb33..227dbff9 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -57,10 +57,7 @@ function LoopResult(P) LoopResult{P}() end -struct BaseResult - converged - body_aero - gamma_new +@with_kw struct BaseResult{P} reference_point alpha_array v_a_array @@ -152,9 +149,10 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - converged, body_aero, gamma_new, reference_point, alpha_array, v_a_array, va_norm_array, + converged, reference_point, alpha_array, v_a_array, va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; log, reference_point) + gamma_new = solver.lr.gamma_new if !isnothing(solver.sol.gamma_distribution) solver.sol.gamma_distribution .= gamma_new else @@ -165,6 +163,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= cl_array = solver.sol.cl_array cd_array = solver.sol.cd_array cm_array = solver.sol.cm_array + panel_width_array = solver.sol.panel_width_array solver.sol.moment_distribution .= 0 solver.sol.moment_coefficient_distribution .= 0 @@ -313,14 +312,14 @@ A dictionary with the results. function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) # calculate intermediate result - converged, body_aero, gamma_new, reference_point, alpha_array, v_a_array, va_norm_array, + converged, reference_point, alpha_array, v_a_array, va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; log, reference_point) # Calculate final results as dictionary results = calculate_results( body_aero, - gamma_new, + solver.lr.gamma_new, reference_point, solver.density, solver.aerodynamic_model_type, @@ -402,8 +401,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut # Return results return ( solver.lr.converged, - body_aero, - solver.lr.gamma_new, reference_point, solver.lr.alpha_array, solver.lr.v_a_array, From 646fe1106c1c03030eb5e247eab4a0fd84e777dd Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 15:37:19 +0100 Subject: [PATCH 50/85] Refactoring --- src/solver.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 227dbff9..2a73acf0 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -149,10 +149,11 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - converged, reference_point, alpha_array, v_a_array, va_norm_array, + reference_point, alpha_array, v_a_array, va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; log, reference_point) gamma_new = solver.lr.gamma_new + converged = solver.lr.converged if !isnothing(solver.sol.gamma_distribution) solver.sol.gamma_distribution .= gamma_new else @@ -312,7 +313,7 @@ A dictionary with the results. function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) # calculate intermediate result - converged, reference_point, alpha_array, v_a_array, va_norm_array, + reference_point, alpha_array, v_a_array, va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; log, reference_point) @@ -400,7 +401,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut # Return results return ( - solver.lr.converged, reference_point, solver.lr.alpha_array, solver.lr.v_a_array, From 04bc2830e33e3eb795d4f4dc9c4efc1f7fe5d20a Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 15:49:10 +0100 Subject: [PATCH 51/85] Refactoring --- src/solver.jl | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index 2a73acf0..f897fc0a 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -149,11 +149,10 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - reference_point, alpha_array, v_a_array, va_norm_array, + reference_point, va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; log, reference_point) gamma_new = solver.lr.gamma_new - converged = solver.lr.converged if !isnothing(solver.sol.gamma_distribution) solver.sol.gamma_distribution .= gamma_new else @@ -164,6 +163,9 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= cl_array = solver.sol.cl_array cd_array = solver.sol.cd_array cm_array = solver.sol.cm_array + converged = solver.lr.converged + alpha_array = solver.lr.alpha_array + v_a_array = solver.lr.v_a_array panel_width_array = solver.sol.panel_width_array solver.sol.moment_distribution .= 0 @@ -313,9 +315,8 @@ A dictionary with the results. function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) # calculate intermediate result - reference_point, alpha_array, v_a_array, va_norm_array, - va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; - log, reference_point) + reference_point, va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; + log, reference_point) # Calculate final results as dictionary results = calculate_results( @@ -326,8 +327,8 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n solver.aerodynamic_model_type, solver.core_radius_fraction, solver.mu, - alpha_array, - v_a_array, + solver.lr.alpha_array, + solver.lr.v_a_array, solver.sol.chord_array, solver.sol.x_airf_array, solver.sol.y_airf_array, @@ -402,8 +403,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut # Return results return ( reference_point, - solver.lr.alpha_array, - solver.lr.v_a_array, va_norm_array, va_unit_array, panels From 24f23b7be287752a5b7782b07aa839843ad46f63 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 15:52:54 +0100 Subject: [PATCH 52/85] Refactoring --- src/solver.jl | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index f897fc0a..d5d9da0d 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -149,9 +149,8 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - reference_point, va_norm_array, - va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; - log, reference_point) + va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; + log, reference_point) gamma_new = solver.lr.gamma_new if !isnothing(solver.sol.gamma_distribution) solver.sol.gamma_distribution .= gamma_new @@ -315,8 +314,8 @@ A dictionary with the results. function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) # calculate intermediate result - reference_point, va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; - log, reference_point) + va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; + log, reference_point) # Calculate final results as dictionary results = calculate_results( @@ -402,7 +401,6 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut # Return results return ( - reference_point, va_norm_array, va_unit_array, panels From c415c9c3adb3ef88e2aeaa38ffa22fedb8c4f960 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 17:26:21 +0100 Subject: [PATCH 53/85] Update struct BaseResult --- src/solver.jl | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index d5d9da0d..d2670c90 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -58,12 +58,8 @@ function LoopResult(P) end @with_kw struct BaseResult{P} - reference_point - alpha_array - v_a_array - va_norm_array - va_unit_array - panels + va_norm_array::Vector{Float64} = zeros(P) + va_unit_array::Matrix{Float64} = zeros(P, 3) end """ @@ -115,6 +111,7 @@ sol::VSMSolution = VSMSolution(): The result of calling [solve!](@ref) # Intermediate results lr::LoopResult{P} = LoopResult(P) + br::BaseResult{P} = BaseResult{P}() # Solution sol::VSMSolution{P} = VSMSolution(P) @@ -149,7 +146,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; + va_norm_array, va_unit_array = solve_base(solver, body_aero, gamma_distribution; log, reference_point) gamma_new = solver.lr.gamma_new if !isnothing(solver.sol.gamma_distribution) @@ -165,6 +162,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= converged = solver.lr.converged alpha_array = solver.lr.alpha_array v_a_array = solver.lr.v_a_array + panels = body_aero.panels panel_width_array = solver.sol.panel_width_array solver.sol.moment_distribution .= 0 @@ -314,8 +312,8 @@ A dictionary with the results. function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) # calculate intermediate result - va_norm_array, va_unit_array, panels = solve_base(solver, body_aero, gamma_distribution; - log, reference_point) + va_norm_array, va_unit_array = solve_base(solver, body_aero, gamma_distribution; + log, reference_point) # Calculate final results as dictionary results = calculate_results( @@ -335,7 +333,7 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n solver.sol.va_array, va_norm_array, va_unit_array, - panels, + body_aero.panels, solver.is_only_f_and_gamma_output ) return results @@ -368,7 +366,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut end # Calculate unit vectors - va_norm_array = norm.(eachrow(solver.sol.va_array)) + va_norm_array = norm.(eachrow(solver.sol.va_array)) # TODO: replace with for loop va_unit_array = solver.sol.va_array ./ va_norm_array # Calculate AIC matrices @@ -402,8 +400,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut # Return results return ( va_norm_array, - va_unit_array, - panels + va_unit_array ) end From 3cbc8f9de5fab59487a36651ecb78cd19e85e6c4 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 17:26:36 +0100 Subject: [PATCH 54/85] Add minimal working example --- mwes/mwe_01.jl | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 mwes/mwe_01.jl diff --git a/mwes/mwe_01.jl b/mwes/mwe_01.jl new file mode 100644 index 00000000..41017352 --- /dev/null +++ b/mwes/mwe_01.jl @@ -0,0 +1,42 @@ +# replace va_norm_array = norm.(eachrow(solver.sol.va_array)) with a for loop + +# testcase +using Test +using LinearAlgebra # for the norm function + +# Define a mock Solver struct +struct MockSolver + sol::NamedTuple +end + +@testset "va_norm_array calculation" begin + # Create a sample 2D array + sample_va_array = [ + 1.0 2.0 3.0; + 4.0 5.0 6.0; + 7.0 8.0 9.0 + ] + + # Create a mock solver with the sample array + mock_solver = MockSolver((va_array = sample_va_array,)) + + # Calculate va_norm_array + va_norm_array = norm.(eachrow(mock_solver.sol.va_array)) + + # Expected results (calculated manually) + expected_norms = [ + sqrt(1^2 + 2^2 + 3^2), + sqrt(4^2 + 5^2 + 6^2), + sqrt(7^2 + 8^2 + 9^2) + ] + + # Test the results + @test length(va_norm_array) == size(sample_va_array, 1) + @test va_norm_array ≈ expected_norms atol=1e-10 + + # Test individual values + @test va_norm_array[1] ≈ norm(sample_va_array[1, :]) atol=1e-10 + @test va_norm_array[2] ≈ norm(sample_va_array[2, :]) atol=1e-10 + @test va_norm_array[3] ≈ norm(sample_va_array[3, :]) atol=1e-10 +end +nothing \ No newline at end of file From 2035e2496fe469b530fabaab79bf9e194d902cda Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 18:37:58 +0100 Subject: [PATCH 55/85] Improve mwe_01.jl --- mwes/mwe_01.jl | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/mwes/mwe_01.jl b/mwes/mwe_01.jl index 41017352..ac1be6e3 100644 --- a/mwes/mwe_01.jl +++ b/mwes/mwe_01.jl @@ -9,7 +9,15 @@ struct MockSolver sol::NamedTuple end +function calc_norm_array!(va_norm_array, va_array) + for i in 1:size(va_array, 1) + va_norm_array[i] = norm(view(va_array, i, :)) + end +end + @testset "va_norm_array calculation" begin + global va_norm_array + # Create a sample 2D array sample_va_array = [ 1.0 2.0 3.0; @@ -21,7 +29,12 @@ end mock_solver = MockSolver((va_array = sample_va_array,)) # Calculate va_norm_array - va_norm_array = norm.(eachrow(mock_solver.sol.va_array)) + n = @allocated va_norm_array = norm.(eachrow(mock_solver.sol.va_array)) + println(n) + + va_norm_array2 = zeros(3) + m = @allocated calc_norm_array!(va_norm_array2, sample_va_array) + println(m) # Expected results (calculated manually) expected_norms = [ @@ -38,5 +51,13 @@ end @test va_norm_array[1] ≈ norm(sample_va_array[1, :]) atol=1e-10 @test va_norm_array[2] ≈ norm(sample_va_array[2, :]) atol=1e-10 @test va_norm_array[3] ≈ norm(sample_va_array[3, :]) atol=1e-10 + + @test length(va_norm_array2) == size(sample_va_array, 1) + @test va_norm_array2 ≈ expected_norms atol=1e-10 + + # Test individual values + @test va_norm_array2[1] ≈ norm(sample_va_array[1, :]) atol=1e-10 + @test va_norm_array2[2] ≈ norm(sample_va_array[2, :]) atol=1e-10 + @test va_norm_array2[3] ≈ norm(sample_va_array[3, :]) atol=1e-10 end nothing \ No newline at end of file From 70bdfd0515fbc63b714ed23d2b21b0bc5d312d99 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 18:57:04 +0100 Subject: [PATCH 56/85] Now 390 allocations --- src/solver.jl | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index d2670c90..d1d1be3e 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -338,6 +338,13 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n ) return results end + +@inline @inbounds function calc_norm_array!(va_norm_array, va_array) + for i in 1:size(va_array, 1) + va_norm_array[i] = norm(MVec3(view(va_array, i, :))) + end +end + function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) @@ -366,12 +373,12 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut end # Calculate unit vectors - va_norm_array = norm.(eachrow(solver.sol.va_array)) # TODO: replace with for loop - va_unit_array = solver.sol.va_array ./ va_norm_array + calc_norm_array!(solver.br.va_norm_array, solver.sol.va_array) + solver.br.va_unit_array .= solver.sol.va_array ./ solver.br.va_norm_array # Calculate AIC matrices - calculate_AIC_matrices!(body_aero, solver.aerodynamic_model_type, solver.core_radius_fraction, va_norm_array, - va_unit_array) + calculate_AIC_matrices!(body_aero, solver.aerodynamic_model_type, solver.core_radius_fraction, solver.br.va_norm_array, + solver.br.va_unit_array) # Initialize gamma distribution gamma_initial = if isnothing(gamma_distribution) @@ -399,8 +406,8 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut # Return results return ( - va_norm_array, - va_unit_array + solver.br.va_norm_array, + solver.br.va_unit_array ) end From 3597ef983f03f63caa65534080f6264fca0e088a Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 19:13:12 +0100 Subject: [PATCH 57/85] Refactoring --- src/solver.jl | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index d1d1be3e..3f15d25c 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -146,8 +146,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - va_norm_array, va_unit_array = solve_base(solver, body_aero, gamma_distribution; - log, reference_point) + solve_base(solver, body_aero, gamma_distribution; log, reference_point) gamma_new = solver.lr.gamma_new if !isnothing(solver.sol.gamma_distribution) solver.sol.gamma_distribution .= gamma_new @@ -199,8 +198,8 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= solver.sol.z_airf_array, solver.sol.x_airf_array, solver.sol.va_array, - va_norm_array, - va_unit_array + solver.br.va_norm_array, + solver.br.va_unit_array ) elseif aerodynamic_model_type === LLT alpha_array @@ -312,8 +311,7 @@ A dictionary with the results. function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) # calculate intermediate result - va_norm_array, va_unit_array = solve_base(solver, body_aero, gamma_distribution; - log, reference_point) + solve_base(solver, body_aero, gamma_distribution; log, reference_point) # Calculate final results as dictionary results = calculate_results( @@ -331,8 +329,8 @@ function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=n solver.sol.y_airf_array, solver.sol.z_airf_array, solver.sol.va_array, - va_norm_array, - va_unit_array, + solver.br.va_norm_array, + solver.br.va_unit_array, body_aero.panels, solver.is_only_f_and_gamma_output ) @@ -404,11 +402,7 @@ function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribut gamma_loop!(solver, body_aero, panels, relaxation_factor/2; log) end - # Return results - return ( - solver.br.va_norm_array, - solver.br.va_unit_array - ) + nothing end """ From 05c733e4fb309b0127e4ac9ee0017f1858bda17c Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 19:40:06 +0100 Subject: [PATCH 58/85] Add TODO --- src/body_aerodynamics.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index fff2322b..8bdd6cf4 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -334,6 +334,7 @@ function calculate_AIC_matrices!(body_aero::BodyAerodynamics, model::Model, # Subtract 2D induced velocity for VSM if icp == jring && model === VSM + # TODO why is this allocating? calculate_velocity_induced_bound_2D!(U_2D, body_aero.panels[jring], ep, body_aero.work_vectors) body_aero.AIC[:, icp, jring] .-= U_2D end From a1eb65035683623219c76b8b6875f35f6f0ea4d7 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 19:54:20 +0100 Subject: [PATCH 59/85] Now 350 allocations --- src/body_aerodynamics.jl | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 8bdd6cf4..3031e76a 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -330,14 +330,13 @@ function calculate_AIC_matrices!(body_aero::BodyAerodynamics, model::Model, core_radius_fraction, body_aero.work_vectors ) - body_aero.AIC[:, icp, jring] .= velocity_induced - + # Subtract 2D induced velocity for VSM - if icp == jring && model === VSM - # TODO why is this allocating? + if icp == jring && model == VSM calculate_velocity_induced_bound_2D!(U_2D, body_aero.panels[jring], ep, body_aero.work_vectors) - body_aero.AIC[:, icp, jring] .-= U_2D + velocity_induced .-= U_2D end + body_aero.AIC[:, icp, jring] .= velocity_induced end end return nothing From 66f933080d5f9097c5e5b735d729c02eb2493f9d Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 19:57:06 +0100 Subject: [PATCH 60/85] Now 348 allocations --- src/body_aerodynamics.jl | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 3031e76a..ac08cfb4 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -297,16 +297,15 @@ Calculate Aerodynamic Influence Coefficient matrices. See also: [BodyAerodynamics](@ref), [Model](@ref) -Returns: - Tuple of (`AIC_x`, `AIC_y`, `AIC_z`) matrices +Returns: nothing """ -function calculate_AIC_matrices!(body_aero::BodyAerodynamics, model::Model, +@inline function calculate_AIC_matrices!(body_aero::BodyAerodynamics, model::Model, core_radius_fraction::Float64, va_norm_array::Vector{Float64}, va_unit_array::Matrix{Float64}) # Determine evaluation point based on model - evaluation_point = model === VSM ? :control_point : :aero_center - evaluation_point_on_bound = model === LLT + evaluation_point = model == VSM ? :control_point : :aero_center + evaluation_point_on_bound = model == LLT # Initialize AIC matrices velocity_induced, tempvel, va_unit, U_2D = zeros(MVec3), zeros(MVec3), zeros(MVec3), zeros(MVec3) From 4d6bd582b3f41d69761a7aeb399b668ff8583905 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 22:09:37 +0100 Subject: [PATCH 61/85] Now 346 allocations --- src/body_aerodynamics.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index ac08cfb4..321070bb 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -412,6 +412,8 @@ function calculate_stall_angle_list(panels::Vector{Panel}; return stall_angles end +const cache_body = [LazyBufferCache()] + """ update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, gamma::Vector{Float64}, core_radius_fraction::Float64, @@ -442,7 +444,7 @@ function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] # Preallocate and calculate induced velocity directly - induced_velocity = similar(va_array) + induced_velocity = cache_body[1][va_array] induced_velocity[:, 1] .= AIC_x * gamma induced_velocity[:, 2] .= AIC_y * gamma induced_velocity[:, 3] .= AIC_z * gamma From ace85bf38e615f9ec74560350c4872a263a0a42c Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 22:13:41 +0100 Subject: [PATCH 62/85] Now 344 allocations --- src/body_aerodynamics.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 321070bb..a1c7dfaa 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -412,7 +412,7 @@ function calculate_stall_angle_list(panels::Vector{Panel}; return stall_angles end -const cache_body = [LazyBufferCache()] +const cache_body = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache()] """ update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, gamma::Vector{Float64}, @@ -454,8 +454,8 @@ function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, # Preallocate and compute dot products manually n = size(relative_velocity, 1) - v_normal = Vector{Float64}(undef, n) - v_tangential = Vector{Float64}(undef, n) + v_normal = cache_body[2][relative_velocity] + v_tangential = cache_body[3][relative_velocity] @inbounds for i in 1:n vn = 0.0 From 306527ed037acf08226f6d0752c9d81c782d9061 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 22:15:40 +0100 Subject: [PATCH 63/85] Now 342 allocations --- src/body_aerodynamics.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index a1c7dfaa..92af7664 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -412,7 +412,7 @@ function calculate_stall_angle_list(panels::Vector{Panel}; return stall_angles end -const cache_body = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache()] +const cache_body = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache()] """ update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, gamma::Vector{Float64}, @@ -469,7 +469,7 @@ function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, end # Direct angle calculation without temporary arrays - alpha_array = Vector{Float64}(undef, n) + alpha_array = cache_body[4][relative_velocity] @inbounds for i in 1:n alpha_array[i] = atan(v_normal[i], v_tangential[i]) end From 98e2b2c73f59408912d7ff0299d0e44372861696 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 22:25:37 +0100 Subject: [PATCH 64/85] Add comment --- src/solver.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/solver.jl b/src/solver.jl index 3f15d25c..ededfb7a 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -190,6 +190,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Calculate alpha corrections based on model type + # TODO: this vector needs to be pre-allocated !!! alpha_corrected = if aerodynamic_model_type == VSM # 4188 bytes update_effective_angle_of_attack_if_VSM( body_aero, From e5e14524edbe7760480cf28882d09a57fc28992c Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 22:51:55 +0100 Subject: [PATCH 65/85] Refactoring --- examples/bench.jl | 15 +++++++-------- src/VortexStepMethod.jl | 2 +- src/body_aerodynamics.jl | 4 +--- src/solver.jl | 8 ++++---- test/bench2.jl | 4 ++-- 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/examples/bench.jl b/examples/bench.jl index 6e6524fb..734d2a95 100644 --- a/examples/bench.jl +++ b/examples/bench.jl @@ -46,12 +46,11 @@ vsm_solver = Solver{P}(aerodynamic_model_type=VSM) # Step 5: Solve using both methods results_vsm = solve(vsm_solver, wa) sol = solve!(vsm_solver, wa) -results_vsm_base = solve_base(vsm_solver, wa) -println("Rectangular wing, solve_base:") -@time results_vsm_base = solve_base(vsm_solver, wa) -# time Python: 32.0 ms Ryzen 7950x -# time Julia: 0.6 ms Ryzen 7950x -# 0.8 ms laptop, performance mode, battery +results_vsm_base = solve_base!(vsm_solver, wa) +println("Rectangular wing, solve_base!:") +@time results_vsm_base = solve_base!(vsm_solver, wa) +# time Python: 32.0 ms Ryzen 7950x +# time Julia: 0.42 ms Ryzen 7950x println("Rectangular wing, solve!:") @time sol = solve!(vsm_solver, wa) println("Rectangular wing, solve:") @@ -83,8 +82,8 @@ set_va!(body_aero, vel_app) # Solving and plotting distributions results = solve(vsm_solver, body_aero) -results_base = solve_base(vsm_solver, body_aero) +results_base = solve_base!(vsm_solver, body_aero) println("RAM-air kite:") -@time results_base = solve_base(vsm_solver, body_aero) +@time results_base = solve_base!(vsm_solver, body_aero) nothing \ No newline at end of file diff --git a/src/VortexStepMethod.jl b/src/VortexStepMethod.jl index 4602bd55..76068db4 100644 --- a/src/VortexStepMethod.jl +++ b/src/VortexStepMethod.jl @@ -21,7 +21,7 @@ using Pkg # Export public interface export Wing, Section, RamAirWing export BodyAerodynamics -export Solver, solve, solve_base, solve!, VSMSolution +export Solver, solve, solve_base!, solve!, VSMSolution export calculate_results export add_section!, set_va! export calculate_span, calculate_projected_area diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 92af7664..9d36a3c0 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -438,9 +438,7 @@ function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, va_unit_array::Matrix{Float64}) # Calculate AIC matrices (keep existing optimized view) - calculate_AIC_matrices!( - body_aero, LLT, core_radius_fraction, va_norm_array, va_unit_array - ) + calculate_AIC_matrices!(body_aero, LLT, core_radius_fraction, va_norm_array, va_unit_array) AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] # Preallocate and calculate induced velocity directly diff --git a/src/solver.jl b/src/solver.jl index ededfb7a..e58261c4 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -15,7 +15,7 @@ Struct for storing the solution of the [solve!](@ref) function. Must contain all - solver_status::SolverStatus: enum, see [SolverStatus](@ref) """ @with_kw mutable struct VSMSolution{P} - ### private vectors of solve_base + ### private vectors of solve_base! x_airf_array::Matrix{Float64} = zeros(P, 3) y_airf_array::Matrix{Float64} = zeros(P, 3) z_airf_array::Matrix{Float64} = zeros(P, 3) @@ -146,7 +146,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= log=false, reference_point=zeros(MVec3), moment_frac=0.1) # calculate intermediate result - solve_base(solver, body_aero, gamma_distribution; log, reference_point) + solve_base!(solver, body_aero, gamma_distribution; log, reference_point) gamma_new = solver.lr.gamma_new if !isnothing(solver.sol.gamma_distribution) solver.sol.gamma_distribution .= gamma_new @@ -312,7 +312,7 @@ A dictionary with the results. function solve(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) # calculate intermediate result - solve_base(solver, body_aero, gamma_distribution; log, reference_point) + solve_base!(solver, body_aero, gamma_distribution; log, reference_point) # Calculate final results as dictionary results = calculate_results( @@ -344,7 +344,7 @@ end end end -function solve_base(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; +function solve_base!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=nothing; log=false, reference_point=zeros(MVec3)) # check arguments diff --git a/test/bench2.jl b/test/bench2.jl index 18ef38c1..9f353185 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -43,8 +43,8 @@ P = length(wa.panels) vsm_solver = Solver{P}(aerodynamic_model_type=VSM) # Step 5: Solve using both methods -println("Rectangular wing, solve_base:") -@btime results_vsm_base = solve_base($vsm_solver, $wa) # 112 allocations +println("Rectangular wing, solve_base!:") +@btime results_vsm_base = solve_base!($vsm_solver, $wa) # 112 allocations # time Python: 32.0 ms Ryzen 7950x # time Julia: 0.6 ms Ryzen 7950x # 0.47 ms laptop, performance mode, grid From 26f2f1d7aa4114b0b327adf61f9403adf71061c5 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 19 Mar 2025 23:04:08 +0100 Subject: [PATCH 66/85] Refactoring --- src/body_aerodynamics.jl | 14 +++++++------- src/solver.jl | 11 +++++++---- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 9d36a3c0..23bb1e46 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -346,24 +346,24 @@ end Calculate circulation distribution for an elliptical wing. -Returns: - Vector{Float64}: Circulation distribution along the wing +Returns: nothing """ -function calculate_circulation_distribution_elliptical_wing(body_aero::BodyAerodynamics, gamma_0::Float64=1.0) +function calculate_circulation_distribution_elliptical_wing(gamma_i, body_aero::BodyAerodynamics, gamma_0::Float64=1.0) length(body_aero.wings) == 1 || throw(ArgumentError("Multiple wings not yet implemented")) wing_span = body_aero.wings[1].span @debug "Wing span: $wing_span" # Calculate y-coordinates of control points - y = [panel.control_point[2] for panel in body_aero.panels] + # TODO: pre-allocate y + n = @allocated y = [panel.control_point[2] for panel in body_aero.panels] + println(n) # Calculate elliptical distribution - gamma_i = gamma_0 * sqrt.(1 .- (2 .* y ./ wing_span).^2) + gamma_i .= gamma_0 * sqrt.(1 .- (2 .* y ./ wing_span).^2) @debug "Calculated circulation distribution: $gamma_i" - - return gamma_i + nothing end """ diff --git a/src/solver.jl b/src/solver.jl index e58261c4..d6ae2041 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -121,6 +121,8 @@ const cache = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBuff LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache()] +const cache_base = [LazyBufferCache()] + """ solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=solver.sol.gamma_distribution; log=false, reference_point=zeros(MVec3), moment_frac=0.1) @@ -380,16 +382,17 @@ function solve_base!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribu solver.br.va_unit_array) # Initialize gamma distribution - gamma_initial = if isnothing(gamma_distribution) + gamma_initial = cache_base[1][solver.sol.chord_array] + if isnothing(gamma_distribution) if solver.type_initial_gamma_distribution === :elliptic - calculate_circulation_distribution_elliptical_wing(body_aero) + calculate_circulation_distribution_elliptical_wing(gamma_initial, body_aero) else - zeros(n_panels) + gamma_initial .= 0 end else length(gamma_distribution) == n_panels || throw(ArgumentError("gamma_distribution length must match number of panels")) - gamma_distribution + gamma_initial .= gamma_distribution end @debug "Initial gamma_new: $gamma_initial" From e733eb31fa1219e56d94623afd3ed04b9fe8f681 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 04:18:42 +0100 Subject: [PATCH 67/85] Update comment --- test/bench2.jl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/bench2.jl b/test/bench2.jl index 9f353185..fd2819c0 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -45,9 +45,8 @@ vsm_solver = Solver{P}(aerodynamic_model_type=VSM) # Step 5: Solve using both methods println("Rectangular wing, solve_base!:") @btime results_vsm_base = solve_base!($vsm_solver, $wa) # 112 allocations -# time Python: 32.0 ms Ryzen 7950x -# time Julia: 0.6 ms Ryzen 7950x -# 0.47 ms laptop, performance mode, grid +# time Python: 32.0 ms Ryzen 7950x +# time Julia: 0.45 ms laptop, performance mode, grid println("Rectangular wing, solve!:") -@btime sol = solve!($vsm_solver, $wa) # 590 allocations +@btime sol = solve!($vsm_solver, $wa) # 590 allocations nothing \ No newline at end of file From 84666437fc9bf38cb294152f092ab9d46b692bc9 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 04:46:01 +0100 Subject: [PATCH 68/85] Update comments --- test/bench2.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/bench2.jl b/test/bench2.jl index fd2819c0..366be43e 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -44,9 +44,9 @@ vsm_solver = Solver{P}(aerodynamic_model_type=VSM) # Step 5: Solve using both methods println("Rectangular wing, solve_base!:") -@btime results_vsm_base = solve_base!($vsm_solver, $wa) # 112 allocations +@btime solve_base!($vsm_solver, $wa, nothing) # 34 allocations # time Python: 32.0 ms Ryzen 7950x # time Julia: 0.45 ms laptop, performance mode, grid println("Rectangular wing, solve!:") -@btime sol = solve!($vsm_solver, $wa) # 590 allocations +@btime sol = solve!($vsm_solver, $wa, nothing) # 342 allocations nothing \ No newline at end of file From 8c5ebbdf412856afbe2813b019fd8d4b72ee3168 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 05:46:17 +0100 Subject: [PATCH 69/85] Refactoring --- src/body_aerodynamics.jl | 20 ++++++++++---------- src/solver.jl | 17 ++++++++--------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 23bb1e46..902849e2 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -428,7 +428,8 @@ Update angle of attack at aerodynamic center for VSM method. Returns: Vector{Float64}: Updated angles of attack """ -function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, +function update_effective_angle_of_attack!(alpha_corrected, + body_aero::BodyAerodynamics, gamma::Vector{Float64}, core_radius_fraction::Float64, z_airf_array::Matrix{Float64}, @@ -467,12 +468,11 @@ function update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, end # Direct angle calculation without temporary arrays - alpha_array = cache_body[4][relative_velocity] @inbounds for i in 1:n - alpha_array[i] = atan(v_normal[i], v_tangential[i]) + alpha_corrected[i] = atan(v_normal[i], v_tangential[i]) end - return alpha_array + nothing end """ @@ -518,6 +518,7 @@ function calculate_results( cd_array = zeros(n_panels) cm_array = zeros(n_panels) panel_width_array = zeros(n_panels) + alpha_corrected = zeros(n_panels) # Calculate coefficients for each panel for (i, panel) in enumerate(panels) @@ -532,8 +533,9 @@ function calculate_results( moment = reshape((cm_array .* 0.5 .* density .* v_a_array.^2 .* chord_array), :, 1) # Calculate alpha corrections based on model type - alpha_corrected = if aerodynamic_model_type === VSM - update_effective_angle_of_attack_if_VSM( + if aerodynamic_model_type === VSM + update_effective_angle_of_attack!( + alpha_corrected, body_aero, gamma_new, core_radius_fraction, @@ -543,10 +545,8 @@ function calculate_results( va_norm_array, va_unit_array ) - elseif aerodynamic_model_type === LLT - alpha_array - else - throw(ArgumentError("Unknown aerodynamic model type, should be LLT or VSM")) + elseif aerodynamic_model_type == LLT + alpha_corrected .= alpha_array end # Verify va is not distributed diff --git a/src/solver.jl b/src/solver.jl index d6ae2041..c3cf02c5 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -121,7 +121,8 @@ const cache = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBuff LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache()] -const cache_base = [LazyBufferCache()] +const cache_base = [LazyBufferCache()] +const cache_solve = [LazyBufferCache()] """ solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution=solver.sol.gamma_distribution; @@ -162,6 +163,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= cm_array = solver.sol.cm_array converged = solver.lr.converged alpha_array = solver.lr.alpha_array + alpha_corrected = cache_solve[1][alpha_array] v_a_array = solver.lr.v_a_array panels = body_aero.panels @@ -190,11 +192,10 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= @. drag = cd_array * 0.5 * density * v_a_array^2 * solver.sol.chord_array @. moment = cm_array * 0.5 * density * v_a_array^2 * solver.sol.chord_array - # Calculate alpha corrections based on model type - # TODO: this vector needs to be pre-allocated !!! - alpha_corrected = if aerodynamic_model_type == VSM # 4188 bytes - update_effective_angle_of_attack_if_VSM( + if aerodynamic_model_type == VSM # 1568 bytes + update_effective_angle_of_attack!( + alpha_corrected, body_aero, gamma_new, solver.core_radius_fraction, @@ -204,10 +205,8 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= solver.br.va_norm_array, solver.br.va_unit_array ) - elseif aerodynamic_model_type === LLT - alpha_array - else - throw(ArgumentError("Unknown aerodynamic model type, should be LLT or VSM")) + elseif aerodynamic_model_type == LLT + alpha_corrected .= alpha_array end # Initialize result arrays From daa7f6deda6ee26923b8dacfd54f2fb66e6bc558 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 06:06:08 +0100 Subject: [PATCH 70/85] Now 340 allocations --- src/body_aerodynamics.jl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 902849e2..619cb9a4 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -412,7 +412,8 @@ function calculate_stall_angle_list(panels::Vector{Panel}; return stall_angles end -const cache_body = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache()] +const cache_body = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), + LazyBufferCache()] """ update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, gamma::Vector{Float64}, @@ -449,12 +450,13 @@ function update_effective_angle_of_attack!(alpha_corrected, induced_velocity[:, 3] .= AIC_z * gamma # In-place relative velocity calculation - relative_velocity = va_array .+ induced_velocity + relative_velocity = cache_body[2][va_array] + relative_velocity .= va_array .+ induced_velocity # Preallocate and compute dot products manually n = size(relative_velocity, 1) - v_normal = cache_body[2][relative_velocity] - v_tangential = cache_body[3][relative_velocity] + v_normal = cache_body[3][relative_velocity] + v_tangential = cache_body[4][relative_velocity] @inbounds for i in 1:n vn = 0.0 From dec97acbd51bb51c8958c06fa178804c19d8dd7d Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 06:09:53 +0100 Subject: [PATCH 71/85] Add comment --- src/body_aerodynamics.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 619cb9a4..c11efe0c 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -444,8 +444,9 @@ function update_effective_angle_of_attack!(alpha_corrected, AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] # Preallocate and calculate induced velocity directly + # TODO rewrite induced_velocity = cache_body[1][va_array] - induced_velocity[:, 1] .= AIC_x * gamma + induced_velocity[:, 1] .= AIC_x * gamma # 304 bytes induced_velocity[:, 2] .= AIC_y * gamma induced_velocity[:, 3] .= AIC_z * gamma From e19461c56d2a5ffe14dae3351b521a41bcabc57d Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 06:21:36 +0100 Subject: [PATCH 72/85] Now 337 allocations --- src/body_aerodynamics.jl | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index c11efe0c..712b0eab 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -441,14 +441,27 @@ function update_effective_angle_of_attack!(alpha_corrected, # Calculate AIC matrices (keep existing optimized view) calculate_AIC_matrices!(body_aero, LLT, core_radius_fraction, va_norm_array, va_unit_array) - AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] + # AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] - # Preallocate and calculate induced velocity directly - # TODO rewrite + # # Preallocate and calculate induced velocity directly + # # TODO rewrite + # induced_velocity = cache_body[1][va_array] + # induced_velocity[:, 1] .= AIC_x * gamma # 304 bytes + # induced_velocity[:, 2] .= AIC_y * gamma + # induced_velocity[:, 3] .= AIC_z * gamma + + # Get views of AIC matrices without copying + AIC_views = (@view(body_aero.AIC[1, :, :]), + @view(body_aero.AIC[2, :, :]), + @view(body_aero.AIC[3, :, :])) + + # Preallocate induced velocity array induced_velocity = cache_body[1][va_array] - induced_velocity[:, 1] .= AIC_x * gamma # 304 bytes - induced_velocity[:, 2] .= AIC_y * gamma - induced_velocity[:, 3] .= AIC_z * gamma + + # Calculate induced velocity components in-place + for (j, aic) in enumerate(AIC_views) # 384 allocated + mul!(@view(induced_velocity[:, j]), aic, gamma) + end # In-place relative velocity calculation relative_velocity = cache_body[2][va_array] From 98a733601a8bacc01014cdf4c7325be762eb937c Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 06:35:30 +0100 Subject: [PATCH 73/85] Update comments --- test/bench2.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/bench2.jl b/test/bench2.jl index 366be43e..f17faadc 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -44,9 +44,9 @@ vsm_solver = Solver{P}(aerodynamic_model_type=VSM) # Step 5: Solve using both methods println("Rectangular wing, solve_base!:") -@btime solve_base!($vsm_solver, $wa, nothing) # 34 allocations +@btime solve_base!($vsm_solver, $wa, nothing) # 34 allocations # time Python: 32.0 ms Ryzen 7950x -# time Julia: 0.45 ms laptop, performance mode, grid +# time Julia: 0.48 ms laptop, performance mode, grid println("Rectangular wing, solve!:") -@btime sol = solve!($vsm_solver, $wa, nothing) # 342 allocations +@btime sol = solve!($vsm_solver, $wa, nothing) # 337 allocations nothing \ No newline at end of file From e1042420a98cfefa6bd77d976485972a21710ec2 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 06:43:35 +0100 Subject: [PATCH 74/85] Now 328 allocations --- src/body_aerodynamics.jl | 32 +++++++++++++++++++++++++------- test/bench2.jl | 2 +- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 712b0eab..171c868e 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -450,17 +450,35 @@ function update_effective_angle_of_attack!(alpha_corrected, # induced_velocity[:, 2] .= AIC_y * gamma # induced_velocity[:, 3] .= AIC_z * gamma - # Get views of AIC matrices without copying - AIC_views = (@view(body_aero.AIC[1, :, :]), - @view(body_aero.AIC[2, :, :]), - @view(body_aero.AIC[3, :, :])) + # # Get views of AIC matrices without copying + # AIC_views = (@view(body_aero.AIC[1, :, :]), + # @view(body_aero.AIC[2, :, :]), + # @view(body_aero.AIC[3, :, :])) + + # # Preallocate induced velocity array + # induced_velocity = cache_body[1][va_array] + + # # Calculate induced velocity components in-place + # for (j, aic) in enumerate(AIC_views) # 384 allocated + # mul!(@view(induced_velocity[:, j]), aic, gamma) + # end + + # Get dimensions from existing data + n_rows = size(body_aero.AIC, 2) + n_cols = size(body_aero.AIC, 3) # Preallocate induced velocity array induced_velocity = cache_body[1][va_array] - # Calculate induced velocity components in-place - for (j, aic) in enumerate(AIC_views) # 384 allocated - mul!(@view(induced_velocity[:, j]), aic, gamma) + # Calculate each component with explicit loops + for j in 1:3 # For each x/y/z component + for i in 1:n_rows + acc = zero(eltype(induced_velocity)) # Type-stable accumulator + for k in 1:n_cols + acc += body_aero.AIC[j, i, k] * gamma[k] + end + induced_velocity[i, j] = acc + end end # In-place relative velocity calculation diff --git a/test/bench2.jl b/test/bench2.jl index f17faadc..829f39be 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -48,5 +48,5 @@ println("Rectangular wing, solve_base!:") # time Python: 32.0 ms Ryzen 7950x # time Julia: 0.48 ms laptop, performance mode, grid println("Rectangular wing, solve!:") -@btime sol = solve!($vsm_solver, $wa, nothing) # 337 allocations +@btime sol = solve!($vsm_solver, $wa, nothing) # 328 allocations nothing \ No newline at end of file From 163d99d73a80cac6ba32f28f45f364015ce3973b Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 06:52:42 +0100 Subject: [PATCH 75/85] Cleanup --- src/body_aerodynamics.jl | 21 --------------------- test/bench.jl | 2 +- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 171c868e..5d83cbd1 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -441,27 +441,6 @@ function update_effective_angle_of_attack!(alpha_corrected, # Calculate AIC matrices (keep existing optimized view) calculate_AIC_matrices!(body_aero, LLT, core_radius_fraction, va_norm_array, va_unit_array) - # AIC_x, AIC_y, AIC_z = @views body_aero.AIC[1, :, :], body_aero.AIC[2, :, :], body_aero.AIC[3, :, :] - - # # Preallocate and calculate induced velocity directly - # # TODO rewrite - # induced_velocity = cache_body[1][va_array] - # induced_velocity[:, 1] .= AIC_x * gamma # 304 bytes - # induced_velocity[:, 2] .= AIC_y * gamma - # induced_velocity[:, 3] .= AIC_z * gamma - - # # Get views of AIC matrices without copying - # AIC_views = (@view(body_aero.AIC[1, :, :]), - # @view(body_aero.AIC[2, :, :]), - # @view(body_aero.AIC[3, :, :])) - - # # Preallocate induced velocity array - # induced_velocity = cache_body[1][va_array] - - # # Calculate induced velocity components in-place - # for (j, aic) in enumerate(AIC_views) # 384 allocated - # mul!(@view(induced_velocity[:, j]), aic, gamma) - # end # Get dimensions from existing data n_rows = size(body_aero.AIC, 2) diff --git a/test/bench.jl b/test/bench.jl index 3351e79b..1435406c 100644 --- a/test/bench.jl +++ b/test/bench.jl @@ -7,7 +7,7 @@ using BenchmarkTools using StaticArrays using VortexStepMethod using VortexStepMethod: calculate_AIC_matrices!, gamma_loop!, calculate_results, - update_effective_angle_of_attack_if_VSM, calculate_projected_area, + update_effective_angle_of_attack!, calculate_projected_area, calculate_cl, calculate_cd_cm, calculate_velocity_induced_single_ring_semiinfinite!, calculate_velocity_induced_bound_2D!, From 54ce6a190a341c9f6b43b9bf36e9334639679e0e Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 07:09:12 +0100 Subject: [PATCH 76/85] Update comment --- src/solver.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solver.jl b/src/solver.jl index c3cf02c5..41c5816c 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -193,7 +193,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= @. moment = cm_array * 0.5 * density * v_a_array^2 * solver.sol.chord_array # Calculate alpha corrections based on model type - if aerodynamic_model_type == VSM # 1568 bytes + if aerodynamic_model_type == VSM # 64 bytes update_effective_angle_of_attack!( alpha_corrected, body_aero, From c56e1746e3cd46f245921b0e689b0a3b18af807f Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 07:11:32 +0100 Subject: [PATCH 77/85] Update comment --- src/solver.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solver.jl b/src/solver.jl index 41c5816c..dcb5f48f 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -220,7 +220,7 @@ function solve!(solver::Solver, body_aero::BodyAerodynamics, gamma_distribution= # Calculate wing geometry properties projected_area = body_aero.projected_area - for (i, panel) in enumerate(panels) # 8008 bytes + for (i, panel) in enumerate(panels) # 8000 bytes ### Lift and Drag ### # Panel geometry From b261c4e8aec13c9135789bce01694032d1e197c1 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 09:36:19 +0100 Subject: [PATCH 78/85] Update comment --- test/bench2.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/bench2.jl b/test/bench2.jl index 829f39be..55fe4947 100644 --- a/test/bench2.jl +++ b/test/bench2.jl @@ -46,7 +46,7 @@ vsm_solver = Solver{P}(aerodynamic_model_type=VSM) println("Rectangular wing, solve_base!:") @btime solve_base!($vsm_solver, $wa, nothing) # 34 allocations # time Python: 32.0 ms Ryzen 7950x -# time Julia: 0.48 ms laptop, performance mode, grid +# time Julia: 0.45 ms Ryzen 7950x println("Rectangular wing, solve!:") @btime sol = solve!($vsm_solver, $wa, nothing) # 328 allocations nothing \ No newline at end of file From fdc7ed4e92a7c16fb40d2a485ce16370876f3fe6 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 11:58:02 +0100 Subject: [PATCH 79/85] Add mwe_02.jl --- mwes/mwe_02.jl | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 mwes/mwe_02.jl diff --git a/mwes/mwe_02.jl b/mwes/mwe_02.jl new file mode 100644 index 00000000..c4ee30e4 --- /dev/null +++ b/mwes/mwe_02.jl @@ -0,0 +1,6 @@ + +using PreallocationTools, Parameters + +Base.@kwdef mutable struct MockSolver + const ca::NTuple{11, LazyBufferCache{typeof(identity), typeof(identity)}} = ([LazyBufferCache() for _ in 1:11]) +end \ No newline at end of file From 831a85e4585441bc2d9b560333e0214e0f0fb14c Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 12:05:48 +0100 Subject: [PATCH 80/85] Cleanup --- src/solver.jl | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/solver.jl b/src/solver.jl index dcb5f48f..df5d017a 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -117,10 +117,7 @@ sol::VSMSolution = VSMSolution(): The result of calling [solve!](@ref) sol::VSMSolution{P} = VSMSolution(P) end -const cache = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), - LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), - LazyBufferCache(), LazyBufferCache(), LazyBufferCache()] - +const cache = [LazyBufferCache() for _ in 1:11] const cache_base = [LazyBufferCache()] const cache_solve = [LazyBufferCache()] From aa5c9121c16de2bd4622e5967020b8f625dbe8a8 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 12:17:03 +0100 Subject: [PATCH 81/85] Add file to .gitignore --- Manifest-v1.10.toml | 1300 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1300 insertions(+) create mode 100644 Manifest-v1.10.toml diff --git a/Manifest-v1.10.toml b/Manifest-v1.10.toml new file mode 100644 index 00000000..d67194f6 --- /dev/null +++ b/Manifest-v1.10.toml @@ -0,0 +1,1300 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.9" +manifest_format = "2.0" +project_hash = "12799e84b2a5b02aa393e741413498f4973e33be" + +[[deps.ADTypes]] +git-tree-sha1 = "e2478490447631aedba0823d4d7a80b2cc8cdb32" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.14.0" +weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"] + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.42" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "017fcb757f8e921fb44ee063a7aafe5f89b86dd1" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.18.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra"] +git-tree-sha1 = "4e25216b8fea1908a0ce0f5d87368587899f75be" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.ArrayLayouts.extensions] + ArrayLayoutsSparseArraysExt = "SparseArrays" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.6" + +[[deps.BracketingNonlinearSolve]] +deps = ["CommonSolve", "ConcreteStructs", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "95cb19c37ea427617e9795655667712f03058d98" +uuid = "70df07ce-3d50-431d-a3e7-ca6ddb60ac1e" +version = "1.1.0" +weakdeps = ["ForwardDiff"] + + [deps.BracketingNonlinearSolve.extensions] + BracketingNonlinearSolveForwardDiffExt = "ForwardDiff" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.6" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.1" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.13" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "c7acce7a7e1078a20a285211dd73cd3941a871d6" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.0" + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + + [deps.ColorTypes.weakdeps] + StyledStrings = "f489334b-da3d-4c2e-b8f0-e476e12c162b" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "64e15186f0aa277e174aa81798f7eb8598e0157e" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.0" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConcreteStructs]] +git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" +uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" +version = "0.2.3" + +[[deps.ConstructionBase]] +git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.8" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DefaultApplication]] +deps = ["InteractiveUtils"] +git-tree-sha1 = "c0dfa5a35710a193d83f03124356eef3386688fc" +uuid = "3f0dd361-4fe0-5fc6-8523-80b14ec94d85" +version = "1.1.0" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffEqBase]] +deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "TruncatedStacktraces"] +git-tree-sha1 = "615e8358608628b9768275f4bd8c237724e72f08" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.164.2" + + [deps.DiffEqBase.extensions] + DiffEqBaseCUDAExt = "CUDA" + DiffEqBaseChainRulesCoreExt = "ChainRulesCore" + DiffEqBaseDistributionsExt = "Distributions" + DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] + DiffEqBaseForwardDiffExt = ["ForwardDiff"] + DiffEqBaseGTPSAExt = "GTPSA" + DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" + DiffEqBaseMPIExt = "MPI" + DiffEqBaseMeasurementsExt = "Measurements" + DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseReverseDiffExt = "ReverseDiff" + DiffEqBaseSparseArraysExt = "SparseArrays" + DiffEqBaseTrackerExt = "Tracker" + DiffEqBaseUnitfulExt = "Unitful" + + [deps.DiffEqBase.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DifferentiationInterface]] +deps = ["ADTypes", "LinearAlgebra"] +git-tree-sha1 = "3999a7934cc723719e79ff7db33160b141297444" +uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" +version = "0.6.44" + + [deps.DifferentiationInterface.extensions] + DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" + DifferentiationInterfaceDiffractorExt = "Diffractor" + DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"] + DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation" + DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" + DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" + DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] + DifferentiationInterfaceGTPSAExt = "GTPSA" + DifferentiationInterfaceMooncakeExt = "Mooncake" + DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] + DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] + DifferentiationInterfaceSparseArraysExt = "SparseArrays" + DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" + DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" + DifferentiationInterfaceStaticArraysExt = "StaticArrays" + DifferentiationInterfaceSymbolicsExt = "Symbolics" + DifferentiationInterfaceTrackerExt = "Tracker" + DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"] + + [deps.DifferentiationInterface.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" + Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EnumX]] +git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.4" + +[[deps.EnzymeCore]] +git-tree-sha1 = "0cdb7af5c39e92d78a0ee8d0a447d32f7593137e" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.8.8" +weakdeps = ["Adapt"] + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.ExproniconLite]] +git-tree-sha1 = "c13f0b150373771b0fdc1713c97860f8df12e6c2" +uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" +version = "0.10.14" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] +git-tree-sha1 = "ab1b34570bcdf272899062e1a56285a53ecaae08" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.3.5" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastPower]] +git-tree-sha1 = "58c3431137131577a7c379d00fea00be524338fb" +uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b" +version = "1.1.1" + + [deps.FastPower.extensions] + FastPowerEnzymeExt = "Enzyme" + FastPowerForwardDiffExt = "ForwardDiff" + FastPowerMeasurementsExt = "Measurements" + FastPowerMonteCarloMeasurementsExt = "MonteCarloMeasurements" + FastPowerReverseDiffExt = "ReverseDiff" + FastPowerTrackerExt = "Tracker" + + [deps.FastPower.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + + [deps.FillArrays.weakdeps] + PDMats = "90014a1f-27ba-587c-ab20-58faa44d9150" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Setfield"] +git-tree-sha1 = "f089ab1f834470c525562030c8cfde4025d5e915" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.27.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffSparseArraysExt = "SparseArrays" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "a2df1b776752e3f344e5116c06d75a10436ab853" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.38" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2025.0.4+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.15.1" + + [deps.Interpolations.extensions] + InterpolationsUnitfulExt = "Unitful" + + [deps.Interpolations.weakdeps] + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + + [deps.InverseFunctions.weakdeps] + Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.Jieko]] +deps = ["ExproniconLite"] +git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c" +uuid = "ae98c720-c025-4a4a-838c-29b094483192" +version = "0.2.1" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "b29d37ce30fa401a4563b18880ab91f979a29734" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.9.10" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.17" + +[[deps.LazyArrays]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "MacroTools", "SparseArrays"] +git-tree-sha1 = "866ce84b15e54d758c11946aacd4e5df0e60b7a3" +uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" +version = "2.6.1" + + [deps.LazyArrays.extensions] + LazyArraysBandedMatricesExt = "BandedMatrices" + LazyArraysBlockArraysExt = "BlockArrays" + LazyArraysBlockBandedMatricesExt = "BlockBandedMatrices" + LazyArraysStaticArraysExt = "StaticArrays" + + [deps.LazyArrays.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.4.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LineSearch]] +deps = ["ADTypes", "CommonSolve", "ConcreteStructs", "FastClosures", "LinearAlgebra", "MaybeInplace", "SciMLBase", "SciMLJacobianOperators", "StaticArraysCore"] +git-tree-sha1 = "97d502765cc5cf3a722120f50da03c2474efce04" +uuid = "87fe0de2-c867-4266-b59a-2f0a94fc965b" +version = "0.1.4" + + [deps.LineSearch.extensions] + LineSearchLineSearchesExt = "LineSearches" + + [deps.LineSearch.weakdeps] + LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearSolve]] +deps = ["ArrayInterface", "ChainRulesCore", "ConcreteStructs", "DocStringExtensions", "EnumX", "GPUArraysCore", "InteractiveUtils", "Krylov", "LazyArrays", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "StaticArraysCore", "UnPack"] +git-tree-sha1 = "6e975dea0fc1825ef3bc83c11281fdf745a69a43" +uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +version = "3.4.0" + + [deps.LinearSolve.extensions] + LinearSolveBandedMatricesExt = "BandedMatrices" + LinearSolveBlockDiagonalsExt = "BlockDiagonals" + LinearSolveCUDAExt = "CUDA" + LinearSolveCUDSSExt = "CUDSS" + LinearSolveEnzymeExt = "EnzymeCore" + LinearSolveFastAlmostBandedMatricesExt = "FastAlmostBandedMatrices" + LinearSolveFastLapackInterfaceExt = "FastLapackInterface" + LinearSolveHYPREExt = "HYPRE" + LinearSolveIterativeSolversExt = "IterativeSolvers" + LinearSolveKernelAbstractionsExt = "KernelAbstractions" + LinearSolveKrylovKitExt = "KrylovKit" + LinearSolveMetalExt = "Metal" + LinearSolvePardisoExt = ["Pardiso", "SparseArrays"] + LinearSolveRecursiveFactorizationExt = "RecursiveFactorization" + LinearSolveSparseArraysExt = "SparseArrays" + LinearSolveSparspakExt = ["SparseArrays", "Sparspak"] + + [deps.LinearSolve.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e" + FastLapackInterface = "29a986be-02c6-4525-aec4-84b980013641" + HYPRE = "b5ffcf37-a2bd-41ab-a3da-4bd9bc8ad771" + IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" + RecursiveFactorization = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2025.0.1+1" + +[[deps.MacroTools]] +git-tree-sha1 = "72aebe0b5051e5143a079a4685a46da330a40472" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.15" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MaybeInplace]] +deps = ["ArrayInterface", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "54e2fdc38130c05b42be423e90da3bade29b74bd" +uuid = "bb5d69b7-63fc-4a16-80bd-7e42200c7bdb" +version = "0.1.4" +weakdeps = ["SparseArrays"] + + [deps.MaybeInplace.extensions] + MaybeInplaceSparseArraysExt = "SparseArrays" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+1" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.Moshi]] +deps = ["ExproniconLite", "Jieko"] +git-tree-sha1 = "453de0fc2be3d11b9b93ca4d0fddd91196dcf1ed" +uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" +version = "0.3.5" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.1.10" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "cc0a5deefdb12ab3a096f00a6d42133af4560d71" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.2" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "NonlinearSolveBase", "NonlinearSolveFirstOrder", "NonlinearSolveQuasiNewton", "NonlinearSolveSpectralMethods", "PrecompileTools", "Preferences", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseMatrixColorings", "StaticArraysCore", "SymbolicIndexingInterface"] +git-tree-sha1 = "95def4e218a6832d158feafb9963be0337ea432c" +uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +version = "4.4.0" + + [deps.NonlinearSolve.extensions] + NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt" + NonlinearSolveFixedPointAccelerationExt = "FixedPointAcceleration" + NonlinearSolveLeastSquaresOptimExt = "LeastSquaresOptim" + NonlinearSolveMINPACKExt = "MINPACK" + NonlinearSolveNLSolversExt = "NLSolvers" + NonlinearSolveNLsolveExt = ["NLsolve", "LineSearches"] + NonlinearSolvePETScExt = ["PETSc", "MPI"] + NonlinearSolveSIAMFANLEquationsExt = "SIAMFANLEquations" + NonlinearSolveSpeedMappingExt = "SpeedMapping" + NonlinearSolveSundialsExt = "Sundials" + + [deps.NonlinearSolve.weakdeps] + FastLevenbergMarquardt = "7a0df574-e128-4d35-8cbd-3d84502bf7ce" + FixedPointAcceleration = "817d07cb-a79a-5c30-9a31-890123675176" + LeastSquaresOptim = "0fc2ff8b-aaa3-5acd-a817-1944a5e08891" + LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" + MINPACK = "4854310b-de5a-5eb6-a2a5-c1dee2bd17f9" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + NLSolvers = "337daf1e-9722-11e9-073e-8b9effe078ba" + NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" + PETSc = "ace2c81b-2b5f-4b1e-a30d-d662738edfe0" + SIAMFANLEquations = "084e46ad-d928-497d-ad5e-07fa361a48c4" + SpeedMapping = "f1835b91-879b-4a3f-a438-e4baacf14412" + Sundials = "c3572dad-4567-51f8-b174-8c6c989267f4" + +[[deps.NonlinearSolveBase]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "CommonSolve", "Compat", "ConcreteStructs", "DifferentiationInterface", "EnzymeCore", "FastClosures", "LinearAlgebra", "Markdown", "MaybeInplace", "Preferences", "Printf", "RecursiveArrayTools", "SciMLBase", "SciMLJacobianOperators", "SciMLOperators", "StaticArraysCore", "SymbolicIndexingInterface", "TimerOutputs"] +git-tree-sha1 = "8a2437b5ead050301b6a6258f226e5137e511000" +uuid = "be0214bd-f91f-a760-ac4e-3421ce2b2da0" +version = "1.5.0" + + [deps.NonlinearSolveBase.extensions] + NonlinearSolveBaseBandedMatricesExt = "BandedMatrices" + NonlinearSolveBaseDiffEqBaseExt = "DiffEqBase" + NonlinearSolveBaseForwardDiffExt = "ForwardDiff" + NonlinearSolveBaseLineSearchExt = "LineSearch" + NonlinearSolveBaseLinearSolveExt = "LinearSolve" + NonlinearSolveBaseSparseArraysExt = "SparseArrays" + NonlinearSolveBaseSparseMatrixColoringsExt = "SparseMatrixColorings" + + [deps.NonlinearSolveBase.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + LineSearch = "87fe0de2-c867-4266-b59a-2f0a94fc965b" + LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + +[[deps.NonlinearSolveFirstOrder]] +deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConcreteStructs", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLJacobianOperators", "Setfield", "StaticArraysCore"] +git-tree-sha1 = "aade7ab02ee4c80ec30dc8a2874fc67155c935f1" +uuid = "5959db7a-ea39-4486-b5fe-2dd0bf03d60d" +version = "1.3.0" + +[[deps.NonlinearSolveQuasiNewton]] +deps = ["ArrayInterface", "CommonSolve", "ConcreteStructs", "DiffEqBase", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLOperators", "StaticArraysCore"] +git-tree-sha1 = "44a132cb32aeafcb35a6238fd91a2f3f8ff5c5b0" +uuid = "9a2c21bd-3a47-402d-9113-8faf9a0ee114" +version = "1.2.0" +weakdeps = ["ForwardDiff"] + + [deps.NonlinearSolveQuasiNewton.extensions] + NonlinearSolveQuasiNewtonForwardDiffExt = "ForwardDiff" + +[[deps.NonlinearSolveSpectralMethods]] +deps = ["CommonSolve", "ConcreteStructs", "DiffEqBase", "LineSearch", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "f28b1ab17b5f15eb2b174eaf8813cf17f0b3e6c0" +uuid = "26075421-4e9a-44e1-8bd1-420ed7ad02b2" +version = "1.1.0" +weakdeps = ["ForwardDiff"] + + [deps.NonlinearSolveSpectralMethods.extensions] + NonlinearSolveSpectralMethodsForwardDiffExt = "ForwardDiff" + +[[deps.OffsetArrays]] +git-tree-sha1 = "5e1897147d1ff8d98883cda2be2187dcf57d8f0c" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.15.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.23+4" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+4" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.0" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6d38fea02d983051776a856b7df75b30cf9a3c1f" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.16" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.2" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterface", "ForwardDiff"] +git-tree-sha1 = "8765738bc5a6f1554cb61c5ddfae5bf279e8b110" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.25" + + [deps.PreallocationTools.extensions] + PreallocationToolsReverseDiffExt = "ReverseDiff" + PreallocationToolsSparseConnectivityTracerExt = "SparseConnectivityTracer" + + [deps.PreallocationTools.weakdeps] + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "35ac79a85c8086892258581d8b6df9cd8db5c91a" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.31.1" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] + RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] + RecursiveArrayToolsStructArraysExt = "StructArrays" + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "04c968137612c4a5629fa531334bb81ad5680f00" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.13" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SciMLBase]] +deps = ["ADTypes", "Accessors", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "ee305515b0946db5f56af699e8b5804fee04146c" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.75.1" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseMLStyleExt = "MLStyle" + SciMLBaseMakieExt = "Makie" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = "Zygote" + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + MLStyle = "d8e11817-5142-5d16-987a-aa16d5891078" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLJacobianOperators]] +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DifferentiationInterface", "FastClosures", "LinearAlgebra", "SciMLBase", "SciMLOperators"] +git-tree-sha1 = "f66048bb969e67bd7d1bdd03cd0b81219642bbd0" +uuid = "19f34311-ddf3-4b8b-af20-060888a46c0e" +version = "0.1.1" + +[[deps.SciMLOperators]] +deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "6149620767866d4b0f0f7028639b6e661b6a1e44" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "0.3.12" +weakdeps = ["SparseArrays", "StaticArraysCore"] + + [deps.SciMLOperators.extensions] + SciMLOperatorsSparseArraysExt = "SparseArrays" + SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" + +[[deps.SciMLStructures]] +deps = ["ArrayInterface"] +git-tree-sha1 = "566c4ed301ccb2a44cbd5a27da5f885e0ed1d5df" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.SimpleNonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "Setfield", "StaticArraysCore"] +git-tree-sha1 = "a3868a6add9f5989d1f4bd21de0333ef89fb9d9f" +uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7" +version = "2.1.0" + + [deps.SimpleNonlinearSolve.extensions] + SimpleNonlinearSolveChainRulesCoreExt = "ChainRulesCore" + SimpleNonlinearSolveDiffEqBaseExt = "DiffEqBase" + SimpleNonlinearSolveReverseDiffExt = "ReverseDiff" + SimpleNonlinearSolveTrackerExt = "Tracker" + + [deps.SimpleNonlinearSolve.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + +[[deps.SparseMatrixColorings]] +deps = ["ADTypes", "DataStructures", "DocStringExtensions", "LinearAlgebra", "Random", "SparseArrays"] +git-tree-sha1 = "e0ae9189392572abe85bc9fd4ce35e772b1e1e10" +uuid = "0a514795-09f3-496d-8182-132a7b665d35" +version = "0.4.14" +weakdeps = ["Colors"] + + [deps.SparseMatrixColorings.extensions] + SparseMatrixColoringsColorsExt = "Colors" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.Static]] +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] +git-tree-sha1 = "f737d444cb0ad07e61b3c1bef8eb91203c321eff" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "1.2.0" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.8.0" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.13" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.10.0" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.7" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.2.1+1" + +[[deps.SymbolicIndexingInterface]] +deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "d6c04e26aa1c8f7d144e1a8c47f1c73d3013e289" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.38" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TestEnv]] +deps = ["Pkg"] +git-tree-sha1 = "2a57e05cb9854e7260c354f1bcdbe5190adba19f" +uuid = "1e6cf692-eddd-4d53-88a5-2d735e33781b" +version = "1.102.0" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "f57facfd1be61c42321765d3551b3df50f7e09f6" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.28" + + [deps.TimerOutputs.extensions] + FlameGraphsExt = "FlameGraphs" + + [deps.TimerOutputs.weakdeps] + FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" + +[[deps.Timers]] +deps = ["Pkg", "TestEnv"] +git-tree-sha1 = "fe7046d2b5bc1d31cde8fd19fad7c5506e3960b4" +uuid = "21f18d07-b854-4dab-86f0-c15a3821819a" +version = "0.1.5" + +[[deps.TruncatedStacktraces]] +deps = ["InteractiveUtils", "MacroTools", "Preferences"] +git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" +uuid = "781d530d-4396-4725-bb49-402e4bee1e77" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.0.0" + +[[deps.Xfoil]] +deps = ["Printf", "xfoil_light_jll"] +git-tree-sha1 = "752ff27037088b747d3138c828ffc0968d2e7766" +uuid = "19641d66-a62d-11e8-2441-8f57a969a9c4" +version = "0.5.0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2022.0.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.xfoil_light_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "1ebea4f4577b2aa95d4151e11ed6210341e76f62" +uuid = "70cc596b-f351-5640-b155-76ddf0ff62ca" +version = "0.2.1+0" From 4fad8b49c4547fc8859b12219f3261ebfa7acfe5 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 12:21:23 +0100 Subject: [PATCH 82/85] Use Julia 1.10 to create bin files --- test/data/ram_air_kite_body_info.bin | Bin 6959 -> 6959 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/data/ram_air_kite_body_info.bin b/test/data/ram_air_kite_body_info.bin index bf99fbff4cb2fd65407e72c968c16c7d3bdc579a..82dc8e67065d053be42ef03478fe0e0424bde4b3 100644 GIT binary patch delta 2842 zcmY+^c{tQ-AIEVsm|=_ZL z_zsK5(+HoLv&)V0v9I`0f^)!o!^UvTUD|_?@sV}GBnNvg?MiS+^)fzn4O5cwAnZD^ ztWEPDELbL#u=LsKxx-S}HyIDT!Y-0-!-=;jxk#huqG>A%lKShoVq7D#nT@J$Vb`Gk zV%yr(bj)8iny$RH!h7zU1jx!#CRJJ_z#-e6o?RsYAEYR2P9;ge`1QNjFYcFshsS8R zUcMNxZn|^5e~CeVqyLP-dofscR1G>NiNTEfY}|$2VsKQ?k&{angR{IMiYh|{5{lY_ ziVlfD{&l1K#rh&3KjE3i7Yl)k%q;JZ3qm@G(>YhMTtf&h$$yO5LZ4aGE@$?c(xd?F zeb|<-;3oi9>|_269v=kmoiH7_!Uv}_?{`}F^MJ6fV{P(g9+<94zvEuW1sbIv-=5Op z0)-&lNcJHPI6!&~gx+k>lI0Ha< z@#etsqCRk;Mc>-+1QUFn_%OeDOE+lu@gEpub}U-C%3PTHyA^EFPaeKSr!|1d4OW*A z#k~Umao>@9idhWO!aFoK@gJd-?UIHqS6?FaC&6bE2kTKnf$GiFOReacUT+C4vja7k zZfUP1b}t%q^)}&wDHDC!PADBa-iP3=W4~&i4xmj_Nm%mLL9}!kRc$kA7%lBT+0~rR zLX}Ae4e1ttjiQDeJA-pwV<_dsXikaQINGW?KBHT8k9IK&=$|Hb3y@6*b7HDrfZ{hYp6HyML6IA(?uwr;=yqUSL=qyh zB~x$qln_a4Y-s765Tcw~IcDNA5jyv|AUDBPgkn}--pb1pAzycWUHZHTu@jgKpRHn~ za)%rCXN(wq6x#nutQDhyCi69bEk@n6pVvIMNYHStUSz$mlLWP!PVIAzks$cq{OOq@ z37X^MY}Zss5Ggz*t*=*tFr0iO!MN-t28`v!|7(Fj8&SX^5T#w58C+%=@FIE|RGf(LPlIYpMN)P$udgb=gU%VoC5 zc4Km6n!aY3<;hir-;pLQMOW+Q4`iI(i(|V@p~DxeGLd*18x;Ggi(yNghq6a>wl3gHHHN)aUnKK4#cX7N3ptv`z9F|(*o8A zrlS->ILdMyzDUM0lzuM8FWEC0>enj)PtV83nJvW6=X9>IN|k^YSrY-lz7n8u>NJV$ zBmpl^2ZjvFNdPV4U~fgE7_2WekyNEEjKC+H2J&4PhYD&yD^3iy^$e#!suqFbnexVj z2oX?HKP&Jz6M=y0L3M{IA+R^lA#^7%#81@_jC-31!RrX(tC+BvMe)CzovMWb;36gd zJ|86j_izS@V4e>+_#E6Fh@YP5XgogvE=aA^9evpc z&SeN%(<7PSu}0#3C#!B?)L`)W(ASPd-9D$RnO1HCyViB2Eu;H3fZO<0a+d;Mfis$x zCi$#luu)}r>(R)U=zr=|mYb8l*P}JQp$%VewIbDojH1504wU{y651&FuxOyy;X6t; zOcd0R%=e00h~NIFMq%v$((a*bj5#}qQhRqs5mkl}zW>?_ERTi4zP5?ztIS8y$gsS1 zN&OfK8?=SwI?TcdMR=A0b zRf(oS#e3* z(YFb+Qx73}`-w7&Xx&d=s^f5U7+V@(H}nwran@CuC^CSlg^jvQKo#hdxAo~Os|7tV z^?9uE2C%}VFOabN4cIv{Szd{M2WUyrmTLn$!Ja#p!^tBbK-P$V&~)ra@atQ3&^3ck z;6ttFlW5jwpyj;Orn>YCI2oZBA6h>MiDstOhzoV;w6den9lL=%wN z)0Q!?Pr6LU*<&0uS3FLe<4u6#jGeVG^#^#Qn4mXgJq2>~t%YpXG>BH4uvq5E0Y>d% zb1M2=;LlEDx61N>jmt?d?Qc9F)7Jf`q?Hc@_!A>)7-b%~ zY3Z0L5q|-%$xSxS^S{8E&WBlvg5RLRVtL5+a4E+nwf7W2dh@n za~odE!Nf4@<+SzkuyOPBlf4XiNX5G;GYm=aLG_Tg>jM%bl^kDAH~K>XmiYavZ-Oa6 zo3cr~n>-nI1RP+*#F3$&cE_Oyd@?+CCr7i{UlICRO-A;!lGB4; zFM&Is-M!voqy!BpKK#ZzO7M4pu3WLSGPHHl7&h9V3~M}wrU#EJLyw3(r{3ICh6&C$ zeZF=pL*3&TJy(TDfwHj=y7#ZAK*|-Lv8DhD%v!nqh0|>cG|5U&>u;h!C+0`3V8Oya zK5qk6TLosvzE!MqQi0v=o%6>cRA5w>@e0zt1@A*jVT%f!8<8`%WUIjRsK3jLRH+b} zoNJa|PlekLB<)&3qrzq{d#X$n6@E-zTJIg4PK8f#nDO%kHW)q;vBlP-k{^_7ys)fHE1 zu}0P|G_7sY8r_0lu5N5t^2;-SRdCzdyA?7%%F4iFu0dYPWSj+aZg5z{}jV$HH} z1<3@(%T>QJ_0ezEdiz^uE14=5Oeu^`1K*3_`k1va^M_Xpj zy?QrMg{}>JsR%5_1EeD9!O5cBA!unc$*OUd8}PSpA(=c-7DKB za|Gy8cV2e9n*e21OEVId3y=hL)4NtSAIVuU^k+`<=_q2)p@nsP+Re!8V!KZvGp!vNDJ&lHzfyms<~$FbY@$o4HBTZA@3C*N$s`({ z2>oD{&P6J{MPhp>TqJeBNBx2u2e}0w%`38>KyM0Jp}V+aNU7-hq<7^g>Qr0ca&_q= z{~JcoHjQrq6A#%a<-}mtV~b%_mt}8osci_AC3+ifSU-r=nWx&`rm>Lva*C=gxgXh# zCE`if`Ve;ekNK+N9@M*&SU7b23ktq=hxoTS1HCPDXf7jlELp1G`Iwf`g5vX3Zr!}x zfYhFzj7gyP)uNQ0qB@6bl_>RWi-ryFAN0G&Z`r3Ak6?6@^%dXfm*B8AssA>u4$4+r z^0OBjp!sk>PamUY$*=78Ia`Mgh<&$qqu~h#@Z)av9546+``dq-IC6Sm`_(qXwt_y; zEjv(n(V!o6BVPo`ma?G6Ag`7lzGDztY!j>NIYV$y&iEJ3?qP7PFc7n>XD>NW;+SY< zKLVP&KP5is9ECO~Ls?v591fA60N-Z6=R=9DM|W_`f4!ABvmZh3Hh=7sR^4;rD9Cxqc-{d>uAo+4-$Q_?$~C<4b! z4|-;W2&ANxMwQ=*Kyh1%&+K;*-~^cnVs6Q;y_^P|E<+`0gjt;ckVt5r5J#_#bI*$|S+ z`Ox=)HLbX`9Br-5Yqq;m4;yLFQr2kQ8bPL+orH-!W9Ud+MFtX%qph`~o4NH9_-6GZ z_?TQK@fgdgKTZz6u`HBiBk5|M#~Q%N@-)(0(V+{f!a+Pp-j(DL&3ut5HiXwK?rXO_ zSBoGH;yMZ;#PssQfN#Iy=?XuW;^$p{_t5^m2o;vliWC>)AJcw9Q~6Vbiayleb8#0T zm0VZ5A6rDIU zC|5s8bTm+aWVU-5IO+<};jvf0t?A_>TiX1lBKl(d%bZ$Pf;Jy9x8y7|)=Z=FeAYP4 ze;Uo2{(bT8_bKFL-m!`qG=(xOBwuTe^Ux2=4W8a1JoHy;PXaI|k^f14otEt+(rC%z zi9O(=o`M%9{nA|Y_TZ5DGfxgWtZ5K5dvF3-$NYKfj`%pz>Uy1Qoj;0hbf<_Yri=0a zcNjt9y?%b&QZ@?fvu^&dWf%?g%WQmHJA}f%HVRf-4kB^p^%r;!3*GG8b&jOmkF-B2 zZH|grjDPD-YJPPO3a(4yc}0IgL0(7hDr{k(v|dqYy{LUjmH706FF7qp&o8v@>+J@l zQ}*1FO#e}fHY@jUI~Gy7oimh5RSh*NKJ;BLzt_O_6Xl+$leUN$fwvv-sKgdUZ z+RdnD0sR6ch3@A%2%L+qA1A&I0X;hUh_dG}$e({Sv!R2%q!ITy6EYLQM67lQ1lH|(7!AnNT0L_sHe}6<(x(E;=VpR@T8vzc$`)}>zg7d{_{e##bW%Ty`!Q2 zo&O&{Zm4pR06Lza>P9qPNhuuU;NMga zkV5R-DEso>kCc&v1X9{)n~-tyA?>T$Bi7i+F@6Qi;jNSXLy#G zqf@Wh1##i_M~XVTp-p0r%ggD7_ikdI@>PA{yFJ+Uxx!*XTVlfEo z+gHqZy&3}P7V?O|Wf;O^WW4f**x-4zAbuon1ZZFS$FCZW!LF$rRd*TV&=#eZKIXuI zSj)eBhPAkW_SWplUf@D%`Tc+SeUos|Ts-MR9S@w3W$YL!m;z7F&9BVxX^3so)VOqk z4~4db$o2rb0Gc~I%vLP^XC=o4XKi~C^sG^@>M;Ka3+WrYRdr_|LuY<DZrK1@5#{2Wvn@pqU^&qI%rZ$Z%L0t~pH6>JI>!*p9U8q>$cu){9@W{QFc*s1Z9 z*?+zhFhXR}-&y|RSp3TA{(rxTW8tQpL@Bzr1QvPNSMEGh0-K|nnKNjT*r>5#7nLE2 zg|!@4w{@4oBo8Jdi&iO2dG3%V%Y}$(Wtv3c4MfbF+VMNjk%a9XTEP|6kg$RMAGOo$ zq%pP~Q@^xA8mqulvvzKf!KS^OthYar!M5r=OUqeH#yXgG-|e%>*yg5&Ec(jjvKTXV z)f25`SuD6^XTnw~Ic!$rjQ`OnIV`1Ph?2~a!*08jH9z-Xh9$Gb4XYW;urPfqrN=wv zF)xPB4v$KCEGn@0*Wz^wn0sAB?z7tp*sU5>N6)j13qk-SNs^bUyRi%v)tF01GIHA6Lc* zpR$bRDHQC{)joTVjTFqLeBhcoje=E_-QP7ILBZaQsB7LomPWyno%OoApHZ;uCmcUI Mzo%dccoWs{KNt9`dH?_b From d82d853ff0e2df26d9d0a4a4d95cb4fbc712a7e6 Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 12:56:00 +0100 Subject: [PATCH 83/85] Address remarks --- src/body_aerodynamics.jl | 3 +-- src/solver.jl | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index 5d83cbd1..dbb2efed 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -412,8 +412,7 @@ function calculate_stall_angle_list(panels::Vector{Panel}; return stall_angles end -const cache_body = [LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), LazyBufferCache(), - LazyBufferCache()] +const cache_body = [LazyBufferCache() for _ in 1:5] """ update_effective_angle_of_attack_if_VSM(body_aero::BodyAerodynamics, gamma::Vector{Float64}, diff --git a/src/solver.jl b/src/solver.jl index df5d017a..2224e6c0 100644 --- a/src/solver.jl +++ b/src/solver.jl @@ -117,6 +117,11 @@ sol::VSMSolution = VSMSolution(): The result of calling [solve!](@ref) sol::VSMSolution{P} = VSMSolution(P) end +function Solver(body_aero; kwargs) + P = length(body_aero.panels) + return Solver{P}(; kwargs...) +end + const cache = [LazyBufferCache() for _ in 1:11] const cache_base = [LazyBufferCache()] const cache_solve = [LazyBufferCache()] From df89b9d233264293fb77fc5ba27b4e62499fa6cf Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 13:25:33 +0100 Subject: [PATCH 84/85] Remove print statement --- src/body_aerodynamics.jl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/body_aerodynamics.jl b/src/body_aerodynamics.jl index dbb2efed..c4ce1346 100644 --- a/src/body_aerodynamics.jl +++ b/src/body_aerodynamics.jl @@ -356,8 +356,7 @@ function calculate_circulation_distribution_elliptical_wing(gamma_i, body_aero:: # Calculate y-coordinates of control points # TODO: pre-allocate y - n = @allocated y = [panel.control_point[2] for panel in body_aero.panels] - println(n) + y = [panel.control_point[2] for panel in body_aero.panels] # Calculate elliptical distribution gamma_i .= gamma_0 * sqrt.(1 .- (2 .* y ./ wing_span).^2) From 39333aa3ab47b84c69a8a635f485996e1e5861ba Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Thu, 20 Mar 2025 13:55:40 +0100 Subject: [PATCH 85/85] Add comments --- mwes/mwe_01.jl | 4 ++-- mwes/mwe_02.jl | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mwes/mwe_01.jl b/mwes/mwe_01.jl index ac1be6e3..685696ff 100644 --- a/mwes/mwe_01.jl +++ b/mwes/mwe_01.jl @@ -1,6 +1,6 @@ -# replace va_norm_array = norm.(eachrow(solver.sol.va_array)) with a for loop +# Replace va_norm_array = norm.(eachrow(solver.sol.va_array)) with a for loop -# testcase +# Testcase that shows that the new function is equivalent to the old, allocating line of code. using Test using LinearAlgebra # for the norm function diff --git a/mwes/mwe_02.jl b/mwes/mwe_02.jl index c4ee30e4..142081ca 100644 --- a/mwes/mwe_02.jl +++ b/mwes/mwe_02.jl @@ -1,4 +1,12 @@ +# I tried to put a lazy cache (to avoid allocations for temporary vectors) +# into a struct. This does not work at all with the macro provided by the package +# Parameters. It works (no syntax error) with the macro Base.@kwdef, but if you +# make use of this cache it is extremely slow. +# +# This mwe can serve as starting point for further investigations. Currently the only +# cache that works is a cache in a global const variable. + using PreallocationTools, Parameters Base.@kwdef mutable struct MockSolver