Case: Ring beam instability
This page demonstrates how to use the package to solve kinetic dispersion relations for the ring beam instability Umeda et al. [5].
Simulation Parameters
- Background Magnetic Field: $B_0 = 96.24$ nT
- Species:
- Ring Beam Electrons ($10\%$)
- Density: $n_r = 0.1 n_0$
- Temperature: $T_r = 51$ eV
- Drift Velocity: $v_{d,z} = 0.1 c$, $v_{d,\perp} = 0.05 c$
- Background Electrons ($90\%$)
- Density: $n_b = 0.9 n_0$
- Temperature: $T_b = 51$ eV
- Drift Velocity: $v_{d} = 0$
- Ring Beam Electrons ($10\%$)
using PlasmaBO
using PlasmaBO: q, me
using Unitful
# Umeda 2012 ring beam configuration
B0 = 96.24e-9 # [Tesla]
T = 51u"eV"
# Ring beam electrons (10% density)
# The first argument (optional) indicates particle type of the distribution (by default we use `proton`)
ring_beam = Maxwellian(:e, 1e5, T; vdz=0.1, vdr=0.05)
# Background electrons (90% density)
background = Maxwellian(:e, 9e5, T)
species = [ring_beam, background]
# Compute normalization
wce = abs(B0 * q / me)
lambdaD = Debye_length(species)
kn = 1 / lambdaD
# Wave vector: k*λD = 0.03, θ = 40°
k = 0.03 / lambdaD
θ = deg2rad(40)
kx = k * sin(θ)
kz = k * cos(θ)
# J=12 provides good accuracy (J-pole approximation order)
ωs = solve(species, B0, kx, kz; N=6, J=12)
# Filter for unstable modes (ω/ωce) with positive growth rate
ω_unstable = filter(ω -> isfinite(ω) && imag(ω) > 0.001*wce, ωs)[1] ./wce0.6229290800314581 + 0.15687749193540707imDispersion Curve Scan
Scan k*λD from 0.01 to 0.3
julia> k_ranges = (0.01:0.005:0.3) .* kn;julia> sol = solve(species, B0, k_ranges, θ; N=6)Solving dispersion (k, θ)... 8%|██ | ETA: 0:00:17 Solving dispersion (k, θ)... 25%|█████▉ | ETA: 0:00:10 Solving dispersion (k, θ)... 34%|███████▊ | ETA: 0:00:09 Solving dispersion (k, θ)... 44%|██████████▏ | ETA: 0:00:07 Solving dispersion (k, θ)... 53%|████████████▏ | ETA: 0:00:06 Solving dispersion (k, θ)... 63%|██████████████▍ | ETA: 0:00:05 Solving dispersion (k, θ)... 76%|█████████████████▌ | ETA: 0:00:03 Solving dispersion (k, θ)... 90%|████████████████████▋ | ETA: 0:00:01 Solving dispersion (k, θ)... 100%|███████████████████████| Time: 0:00:12 PlasmaBO.DispersionSolution{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Float64, Matrix{Vector{ComplexF64}}}(0.00018836306291400675:9.418153145700338e-5:0.005650891887420202, 0.6981317007977318, Vector{ComplexF64}[[-102928.90548158181 - 993.7228680306507im, -102928.9054815812 - 993.722868030643im, -102928.90548158066 - 993.7228680307062im, -102456.80666101417 - 1093.7583777184727im, -102456.8066610138 - 1093.7583777184163im, -102456.8066610137 - 1093.7583777183795im, -102074.22773810994 - 1156.3266317857888im, -102074.22773810978 - 1156.3266317857488im, -102074.22773810962 - 1156.3266317857388im, -101728.72370944696 - 1186.7577946923009im … 106054.56332202461 - 1186.7577946924016im, 106400.06735068667 - 1156.3266317857065im, 106400.0673506869 - 1156.3266317857274im, 106400.0673506873 - 1156.326631785711im, 106782.64627359055 - 1093.7583777184188im, 106782.6462735909 - 1093.758377718419im, 106782.64627359112 - 1093.7583777183809im, 107254.74509415824 - 993.7228680307023im, 107254.7450941583 - 993.7228680306739im, 107254.74509415832 - 993.7228680306735im]; [-104132.24871347536 - 4.5103124194459816e-7im, -103612.706871359 - 1490.5843020460165im, -103612.70687135846 - 1490.584302046002im, -103612.70687135836 - 1490.5843020459529im, -102904.55864050768 - 1640.6375665776077im, -102904.55864050717 - 1640.6375665776418im, -102904.55864050712 - 1640.6375665776604im, -102330.69025615315 - 1734.489947678575im, -102330.6902561525 - 1734.4899476785668im, -102330.6902561515 - 1734.4899476785415im … 108301.19363202338 - 1780.1366920302885im, 108819.449675014 - 1734.4899476801215im, 108819.44967501597 - 1734.4899476785872im, 108819.44967501635 - 1734.4899476785668im, 109393.3180593726 - 1640.6375665780545im, 109393.31805937267 - 1640.6375665776172im, 109393.31805937277 - 1640.6375665776436im, 110101.4662902233 - 1490.5843020459856im, 110101.46629022392 - 1490.5843020460356im, 110101.46629022474 - 1490.5843020460015im]; … ; [-1.6668220831543824e6 - 9.89057298284024e-8im, -1.666807324379411e6 - 9.558834790368564e-8im, -141905.58707923646 - 29314.820180623916im, -141905.5846988624 - 29314.824606904665im, -141905.58469884912 - 29314.824606926217im, -127978.72728981121 - 32265.96069141162im, -127978.66949212489 - 32265.872142693457im, -127978.66949188727 - 32265.872142228236im, -124978.76571094568 - 29314.701388747442im, -124978.70091519153 - 29314.824606904782im … 252590.96948620386 - 29314.82460690479im, 252611.62182677488 - 29293.73159193083im, 255590.93762409026 - 32265.868740157235im, 255590.93806313514 - 32265.87214269329im, 255608.17626417306 - 32353.93432042384im, 269517.8531410973 - 29314.824731368768im, 269517.85326987406 - 29314.824606904684im, 269521.127869128 - 29311.45320144427im, 1.6668074216658405e6 - 1.0634694431500835e-7im, 1.6668222495912698e6 - 1.1280917533440515e-7im]; [-1.6950407498886846e6 - 9.703944670036435e-8im, -1.695026489885851e6 - 9.372138265462127e-8im, -142589.38889039785 - 29811.680860947894im, -142589.38608864121 - 29811.68604092037im, -142589.3860886239 - 29811.686040946137im, -128426.48880589366 - 32812.855151548465im, -128426.42147161724 - 32812.75133155265im, -128426.42147133258 - 32812.75133098848im, -125662.57610517862 - 29811.546678396837im, -125662.50230496896 - 29811.686040920205im … 255437.69068226722 - 29811.686040919867im, 255460.25608181788 - 29788.668990348266im, 258201.60934377948 - 32812.74728800629im, 258201.60984891717 - 32812.75133155276im, 258220.94092715677 - 32912.85193048555im, 272364.57431251614 - 29811.686188422842im, 272364.57446594007 - 29811.68604092006im, 272368.31492630125 - 29807.85989216482im, 1.6950265946531384e6 - 1.0440400982116016e-7im, 1.6950409216652366e6 - 1.1118754628114402e-7im];;])
# k, ω pairs for initial branch points (see `BranchPoint` for more control over tracking)
initial_points = [
(0.1 * kn, 0.3im * wce),
(0.1 * kn, 0.1im * wce),
(0.2 * kn, 0.25im * wce)
]
branches = track.(sol, initial_points)
# Extract individual branches
for (i, (k_branch, ω_branch)) in enumerate(branches)
println("Branch $i:")
println(" k range: $(minimum(k_branch)) to $(maximum(k_branch))")
println(" Max growth rate: γ = $(maximum(imag.(ω_branch)))")
endBranch 1:
k range: 0.00018836306291400675 to 0.005650891887420202
Max growth rate: γ = 5508.503362137056
Branch 2:
k range: 0.00018836306291400675 to 0.005650891887420202
Max growth rate: γ = 2253.5376227170564
Branch 3:
k range: 0.00018836306291400675 to 0.005650891887420202
Max growth rate: γ = 4434.587877264941Plot all branches
using CairoMakie
plot_branches(branches, kn, wce)