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.6229290800314463 + 0.1568774919353507imDispersion 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:16 Solving dispersion (k, θ)... 25%|█████▉ | ETA: 0:00:10 Solving dispersion (k, θ)... 36%|████████▏ | ETA: 0:00:08 Solving dispersion (k, θ)... 46%|██████████▌ | ETA: 0:00:07 Solving dispersion (k, θ)... 59%|█████████████▋ | ETA: 0:00:05 Solving dispersion (k, θ)... 71%|████████████████▍ | ETA: 0:00:04 Solving dispersion (k, θ)... 81%|██████████████████▊ | ETA: 0:00:02 Solving dispersion (k, θ)... 92%|█████████████████████ | 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.90548158168 - 993.7228680306511im, -102928.90548158165 - 993.7228680307092im, -102928.90548158145 - 993.7228680306503im, -102456.80666101506 - 1093.7583777183704im, -102456.80666101469 - 1093.758377718459im, -102456.80666101383 - 1093.7583777184084im, -102074.22773811055 - 1156.3266317857294im, -102074.22773811035 - 1156.3266317857622im, -102074.22773811026 - 1156.3266317856833im, -101728.7237094478 - 1186.757794692378im … 106054.56332202534 - 1186.7577946923122im, 106400.0673506876 - 1156.3266317857328im, 106400.06735068763 - 1156.3266317857508im, 106400.06735068766 - 1156.3266317857262im, 106782.64627359097 - 1093.7583777184095im, 106782.64627359119 - 1093.7583777184245im, 106782.6462735916 - 1093.7583777183918im, 107254.74509415806 - 993.7228680306737im, 107254.74509415828 - 993.7228680306458im, 107254.7450941587 - 993.7228680306483im]; [-104132.24871347478 - 4.5149553414480445e-7im, -103612.70687135901 - 1490.584302046028im, -103612.70687135839 - 1490.5843020459956im, -103612.70687135801 - 1490.584302046034im, -102904.55864050805 - 1640.6375665776047im, -102904.5586405079 - 1640.63756657762im, -102904.5586405078 - 1640.6375665776518im, -102330.6902561531 - 1734.4899476785256im, -102330.69025615203 - 1734.4899476784744im, -102330.69025615187 - 1734.4899476785913im … 108301.19363202344 - 1780.1366920303024im, 108819.44967501386 - 1734.489947680158im, 108819.44967501589 - 1734.489947678594im, 108819.44967501664 - 1734.4899476785793im, 109393.31805937192 - 1640.637566577651im, 109393.31805937257 - 1640.6375665776113im, 109393.31805937327 - 1640.6375665780195im, 110101.46629022328 - 1490.5843020459527im, 110101.46629022334 - 1490.5843020459938im, 110101.46629022369 - 1490.5843020460113im]; … ; [-1.6668220831543813e6 - 9.953510016202927e-8im, -1.666807324379409e6 - 9.614814189262688e-8im, -141905.58707923803 - 29314.820180624105im, -141905.58469886315 - 29314.82460690481im, -141905.58469885058 - 29314.824606926304im, -127978.72728981172 - 32265.960691412074im, -127978.66949212486 - 32265.872142693614im, -127978.66949188718 - 32265.87214222847im, -124978.765710946 - 29314.70138874769im, -124978.70091519378 - 29314.82460690511im … 252590.96948620412 - 29314.824606904996im, 252611.62182677528 - 29293.731591930813im, 255590.93762409204 - 32265.868740157035im, 255590.9380631336 - 32265.872142693253im, 255608.1762641742 - 32353.934320423934im, 269517.8531410979 - 29314.8247313688im, 269517.85326987575 - 29314.824606904876im, 269521.12786912825 - 29311.453201444267im, 1.6668074216658373e6 - 1.0622846796128071e-7im, 1.6668222495912646e6 - 1.1259453458478674e-7im]; [-1.6950407498886837e6 - 9.71958797890693e-8im, -1.6950264898858508e6 - 9.385234989167657e-8im, -142589.38889039832 - 29811.680860947905im, -142589.38608864057 - 29811.68604092027im, -142589.38608862436 - 29811.686040946068im, -128426.48880589259 - 32812.855151548516im, -128426.42147161825 - 32812.75133155268im, -128426.42147133217 - 32812.75133098841im, -125662.57610517889 - 29811.546678396822im, -125662.50230496828 - 29811.68604092019im … 255437.69068227074 - 29811.686040920384im, 255460.25608181732 - 29788.66899034811im, 258201.60934377517 - 32812.74728800639im, 258201.60984891784 - 32812.75133155264im, 258220.9409271583 - 32912.85193048627im, 272364.5743125167 - 29811.68618842327im, 272364.5744659382 - 29811.68604091988im, 272368.3149263 - 29807.85989216488im, 1.695026594653134e6 - 1.0458487161371655e-7im, 1.6950409216652343e6 - 1.1110796549473889e-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.503362136958
Branch 2:
k range: 0.00018836306291400675 to 0.005650891887420202
Max growth rate: γ = 2253.5376227170295
Branch 3:
k range: 0.00018836306291400675 to 0.005650891887420202
Max growth rate: γ = 4434.587877266629Plot all branches
using CairoMakie
plot_branches(branches, kn, wce)