Skip to content

Commit e6d8957

Browse files
committed
Added benchmark and improved surface_integral
AK.mapreduce was really slowing down surface_integral. I replaced it with mapbody!, followed by a simple sum over the panels. It's much faster.
1 parent 69d08ee commit e6d8957

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

examples/benchmark.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using NeumannKelvin,BenchmarkTools,Test
2+
3+
S(θ,φ) = SA[sin(θ)*cos(φ), sin(θ)*sin(φ), cos(θ)]
4+
panels = panelize(S, 0, π/2, 0, π, hᵤ=1/64, N_max=Inf) # quite a few panels
5+
6+
@btime extrema(cₚ(directsolve!(BodyPanelSystem($panels,sym_axes=(2,3)),verbose=false)))
7+
@btime extrema(cₚ(gmressolve!(BodyPanelSystem($panels,sym_axes=(2,3)),verbose=false)))
8+
@btime extrema(cₚ(gmressolve!(BodyPanelSystem($panels,sym_axes=(2,3),wrap=PanelTree),verbose=false)))
9+
@btime extrema(cₚ(gmressolve!(BodyPanelSystem($panels,sym_axes=(2,3),wrap=PanelTree,θ²=1),verbose=false)))
10+
11+
sys = gmressolve!(BodyPanelSystem(panels,sym_axes=(2,3),wrap=PanelTree,θ²=1),verbose=false);
12+
@btime extrema(cₚ($sys))
13+
@btime steadyforce($sys)

src/panel_method.jl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,8 @@ See also: [`cₚ`](@ref)
7979
"""
8080
steadyforce(sys;S=bodyarea(sys)) = -surface_integral(cₚ,sys)/S
8181
@inline function surface_integral(f,sys)
82-
init = neutral = zero(eltype(sys.body.n))
83-
AK.mapreduce(+, sys.body, AK.get_backend(sys.body.q); init, neutral) do p
84-
f(p.x,sys) * p.n * p.dA
85-
end
82+
a = mapbody!(f,similar(sys.body.q),sys)
83+
sum(i->a[i]*sys.body.n[i]*sys.body.dA[i],eachindex(a)) # sum quick
8684
end
8785

8886
"""

0 commit comments

Comments
 (0)