Ideal ballooning solver

Ideal ballooning solver#

This example runs the ideal ballooning solver in pyrokinetics for a range of \(\hat{s}\) and \(\beta\) and plots this data

import numpy as np
import matplotlib.pyplot as plt
from pyrokinetics import Pyro
from pyrokinetics.diagnostics import Diagnostics
from pyrokinetics import template_dir

nshat = 15
nbprime = 20
shat = np.linspace(0.0, 2, nshat)
bprime = np.linspace(0.0, -0.5, nbprime)

pyro = Pyro(gk_file=template_dir / "input.gs2")

gamma = np.empty((nshat, nbprime))

for i_s, s in enumerate(shat):
    for i_b, b in enumerate(bprime):
        pyro.local_geometry.shat = s
        pyro.local_geometry.beta_prime = b
        diag = Diagnostics(pyro)
        gamma[i_s, i_b] = diag.ideal_ballooning_solver()


fig, ax = plt.subplots(1, 1, sharex=True, figsize=(8, 7))

cs = ax.contourf(abs(bprime), shat, gamma)
cs_0 = ax.contour(
    abs(bprime),
    shat,
    gamma,
    colors="w",
    linewidths=(2,),
    levels=[
        0.0,
    ],
)

ax.clabel(cs_0, fmt="%.1e", colors="w", fontsize=22)
ax.set_ylabel(r"$\hat{s}$")
ax.set_xlabel(r"$|\beta'|$")
fig.colorbar(cs)
ax.set_title("IBM growth rate")
fig.tight_layout()
plt.show()

This would generate the following figure

../_images/ideal_ballooning.png

Note this works for any pyro object independant of the LocalGeometry chosen.

The algorithm used to solve the ideal ballooning equation was taken from ideal-ballooning-solver