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. [6].

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] ./wce
0.6229290799953453 + 0.15687749193741884im

Dispersion 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, θ)... 5%|█▏ | ETA: 0:00:24 Solving dispersion (k, θ)... 10%|██▍ | ETA: 0:00:23 Solving dispersion (k, θ)... 15%|███▌ | ETA: 0:00:21 Solving dispersion (k, θ)... 20%|████▋ | ETA: 0:00:20 Solving dispersion (k, θ)... 25%|█████▉ | ETA: 0:00:19 Solving dispersion (k, θ)... 31%|███████ | ETA: 0:00:17 Solving dispersion (k, θ)... 36%|████████▏ | ETA: 0:00:16 Solving dispersion (k, θ)... 41%|█████████▍ | ETA: 0:00:15 Solving dispersion (k, θ)... 46%|██████████▌ | ETA: 0:00:13 Solving dispersion (k, θ)... 51%|███████████▊ | ETA: 0:00:12 Solving dispersion (k, θ)... 56%|████████████▉ | ETA: 0:00:11 Solving dispersion (k, θ)... 61%|██████████████ | ETA: 0:00:10 Solving dispersion (k, θ)... 66%|███████████████▎ | ETA: 0:00:08 Solving dispersion (k, θ)... 71%|████████████████▍ | ETA: 0:00:07 Solving dispersion (k, θ)... 76%|█████████████████▌ | ETA: 0:00:06 Solving dispersion (k, θ)... 81%|██████████████████▊ | ETA: 0:00:05 Solving dispersion (k, θ)... 86%|███████████████████▉ | ETA: 0:00:03 Solving dispersion (k, θ)... 92%|█████████████████████ | ETA: 0:00:02 Solving dispersion (k, θ)... 97%|██████████████████████▎| ETA: 0:00:01 Solving dispersion (k, θ)... 100%|███████████████████████| Time: 0:00:24 PlasmaBO.DispersionSolution{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, Float64, Matrix{Vector{ComplexF64}}}(0.00018836306290145928:9.418153145072964e-5:0.005650891887043779, 0.6981317007977318, Vector{ComplexF64}[[-102928.9054814902 - 993.7228679644902im, -102928.90548148978 - 993.7228679644904im, -102928.90548148974 - 993.7228679644868im, -102456.80666095433 - 1093.7583776455494im, -102456.80666095429 - 1093.7583776455685im, -102456.8066609541 - 1093.7583776455035im, -102074.2277380771 - 1156.3266317087334im, -102074.22773807663 - 1156.3266317087403im, -102074.2277380759 - 1156.3266317086907im, -101728.72370943728 - 1186.7577946133406im … 106054.56332172497 - 1186.7577946132365im, 106400.0673503645 - 1156.326631708699im, 106400.06735036467 - 1156.326631708655im, 106400.06735036508 - 1156.3266317086884im, 106782.6462732423 - 1093.7583776455456im, 106782.64627324301 - 1093.758377645554im, 106782.6462732436 - 1093.7583776455413im, 107254.74509377874 - 993.7228679644766im, 107254.74509377887 - 993.7228679644829im, 107254.74509377939 - 993.7228679644683im]; [-104132.24870668541 - 4.5108352936240863e-7im, -103612.7068712227 - 1490.5843019467345im, -103612.70687122193 - 1490.5843019466954im, -103612.70687122172 - 1490.584301946753im, -102904.55864041817 - 1640.6375664682998im, -102904.55864041793 - 1640.637566468371im, -102904.55864041779 - 1640.637566468323im, -102330.69025610089 - 1734.4899475630486im, -102330.69025610038 - 1734.4899475630239im, -102330.69025610008 - 1734.4899475629766im … 108301.1936315748 - 1780.1366919116404im, 108819.44967453014 - 1734.4899475647146im, 108819.44967453313 - 1734.4899475629927im, 108819.44967453326 - 1734.489947562979im, 109393.3180588507 - 1640.637566468381im, 109393.3180588507 - 1640.6375664683324im, 109393.31805885081 - 1640.6375664687118im, 110101.46628965435 - 1490.5843019467825im, 110101.46628965459 - 1490.5843019467288im, 110101.4662896553 - 1490.5843019467288im]; … ; [-1.6668220830433473e6 - 9.887298801913857e-8im, -1.6668073242683746e6 - 9.540735845803283e-8im, -141905.58707655 - 29314.820178671398im, -141905.58469617605 - 29314.824604952184im, -141905.5846961633 - 29314.824604973495im, -127978.72728805167 - 32265.96068926252im, -127978.66949036525 - 32265.872140544307im, -127978.66949012781 - 32265.872140079064im, -124978.76570825951 - 29314.70138679501im, -124978.70091250398 - 29314.824604951937im … 252590.9694750145 - 29314.82460495227im, 252611.62181557846 - 29293.731589988896im, 255590.9376138299 - 32265.8687380075im, 255590.9380528743 - 32265.8721405438im, 255608.1762539038 - 32353.934318217354im, 269517.8531299085 - 29314.824729415934im, 269517.85325868614 - 29314.824604952126im, 269521.1278579378 - 29311.453199493844im, 1.6668074215548062e6 - 1.0561244599260194e-7im, 1.6668222494802347e6 - 1.1208476280444302e-7im]; [-1.69504074977577e6 - 9.770155884325504e-8im, -1.6950264897729377e6 - 9.429049896425568e-8im, -142589.38888766442 - 29811.6808589622im, -142589.38608590802 - 29811.68603893448im, -142589.3860858912 - 29811.68603896025im, -128426.48880410435 - 32812.855149362695im, -128426.42146982886 - 32812.75132936702im, -128426.42146954127 - 32812.75132880263im, -125662.57610244579 - 29811.546676411035im, -125662.5023022346 - 29811.686038933996im … 255437.69067088878 - 29811.686038934036im, 255460.25607042707 - 29788.66898837329im, 258201.60933334392 - 32812.74728582041im, 258201.60983848313 - 32812.75132936666im, 258220.94091671085 - 32912.85192823611im, 272364.57430113753 - 29811.68618643719im, 272364.57445456187 - 29811.68603893442im, 272368.3149149203 - 29807.859890181542im, 1.6950265945402263e6 - 1.034587289896853e-7im, 1.6950409215523268e6 - 1.1005386113538407e-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)))")
end
Branch 1:
  k range: 0.00018836306290145928 to 0.005650891887043779
  Max growth rate: γ = 5508.503362182702
Branch 2:
  k range: 0.00018836306290145928 to 0.005650891887043779
  Max growth rate: γ = 2253.5376226599806
Branch 3:
  k range: 0.00018836306290145928 to 0.005650891887043779
  Max growth rate: γ = 4434.587877026486

Plot all branches

using CairoMakie

plot_branches(branches, kn, wce)
Example block output