From b8670caf10d5b5eb8bc224706df33a2004ad5e48 Mon Sep 17 00:00:00 2001 From: Boaz Blankrot <34473471+bblankrot@users.noreply.github.com> Date: Thu, 23 May 2019 14:15:33 +0200 Subject: [PATCH] added recurrence option to calc_far_field and test --- src/visualization.jl | 16 ++++++++++------ test/fmm_test.jl | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/visualization.jl b/src/visualization.jl index 5a2fd2a..9420d1f 100644 --- a/src/visualization.jl +++ b/src/visualization.jl @@ -57,14 +57,14 @@ end """ plot_far_field(k0, kin, P, sp::ScatteringProblem, pw::PlaneWave; - opt::FMMoptions = FMMoptions(), use_multipole = true, + opt::FMMoptions = FMMoptions(), method = "multipole", plot_points = 200) Plots and returns the echo width (radar cross section in two dimensions) for a -given scattering problem. `opt`, `use_multipole` are as in `plot_near_field`. +given scattering problem. `opt`, `method` are as in `plot_near_field`. """ function plot_far_field(k0, kin, P, sp::ScatteringProblem, pw::PlaneWave; - opt::FMMoptions = FMMoptions(), use_multipole = true, + opt::FMMoptions = FMMoptions(), method = "multipole", plot_points = 200) Rmax = maximum(s.R for s in sp.shapes) @@ -81,7 +81,7 @@ function plot_far_field(k0, kin, P, sp::ScatteringProblem, pw::PlaneWave; points = [x_far y_far] Ez = calc_far_field(k0, kin, P, points, sp, pw, - use_multipole = use_multipole, opt = opt) + method = method, opt = opt) Ez[:] = (k0*Rfar)*abs2.(Ez) #plot echo width figure() @@ -264,7 +264,7 @@ function calc_near_field(k0, kin, P, sp::ScatteringProblem, points, ui::Einc; end function calc_far_field(k0, kin, P, points, sp::ScatteringProblem, pw::PlaneWave; - opt::FMMoptions = FMMoptions(), use_multipole = true) + opt::FMMoptions = FMMoptions(), method = "multipole") #calc only scattered field + assumes all points are outside shapes shapes = sp.shapes; centers = sp.centers; ids = sp.ids; φs = sp.φs if opt.FMM @@ -278,9 +278,13 @@ function calc_far_field(k0, kin, P, points, sp::ScatteringProblem, pw::PlaneWave beta, sigma_mu = solve_particle_scattering(k0, kin, P, sp, pw) end Ez = zeros(Complex{Float64}, size(points,1)) - if use_multipole + + if method == "multipole" scattered_field_multipole!(Ez, k0, beta, P, centers, 1:size(sp), points, 1:size(points,1)) + elseif method == "recurrence" + scattered_field_multipole_recurrence!(Ez, k0, beta, P, centers, + 1:size(sp), points, 1:size(points,1)) else for ic = 1:size(sp) if typeof(shapes[ids[ic]]) == ShapeParams diff --git a/test/fmm_test.jl b/test/fmm_test.jl index fb06213..4771c9d 100644 --- a/test/fmm_test.jl +++ b/test/fmm_test.jl @@ -43,12 +43,12 @@ u1 = calc_near_field(k0, kin, P, sp, points, PlaneWave(θ_i); opt = fmm_options, verbose = false) u2 = calc_near_field(k0, kin, P, sp, points, PlaneWave(θ_i); opt = fmm_options, - verbose = true, use_multipole = false) + verbose = true, method = "density") @test norm(u1 - u2)/norm(u1) < 1e-6 u3 = calc_near_field(k0, kin, P, sp, points, LineSource(-0.8λ0,-λ0); opt = fmm_options, verbose = false) u4 = calc_near_field(k0, kin, P, sp, points, LineSource(-0.8λ0,-λ0); opt = fmm_options, - verbose = true, use_multipole = false) + verbose = true, method = "recurrence") @test norm(u3 - u4)/norm(u3) < 1e-6 end