bluemira.equilibria.profiles

Plasma profile objects, shape functions, and associated tools

Classes

SinglePowerFunc

Function object for a single power profile

DoublePowerFunc

Function object for a double power profile

LaoPolynomialFunc

Function object for a Lao polynomial profile

LuxonExpFunc

Function object for a Luxon exponential profile

BetaIpProfile

Constrain poloidal Beta and plasma current following logic as laid out in

CustomProfile

User-specified profile functions p'(psi), ff'(psi)

Module Contents

class bluemira.equilibria.profiles.SinglePowerFunc(args)

Bases: ShapeFunction

Inheritance diagram of bluemira.equilibria.profiles.SinglePowerFunc

Function object for a single power profile

_order = 1
_fact = 1
coeffs
static _dfunc(x: float, *args) float
Parameters:

x (float)

Return type:

float

class bluemira.equilibria.profiles.DoublePowerFunc(args)

Bases: ShapeFunction

Inheritance diagram of bluemira.equilibria.profiles.DoublePowerFunc

Function object for a double power profile

_order = 2
_fact = 1
coeffs
static _dfunc(x: float, *args) float
Parameters:

x (float)

Return type:

float

class bluemira.equilibria.profiles.LaoPolynomialFunc(coeffs: numpy.typing.ArrayLike)

Bases: ShapeFunction

Inheritance diagram of bluemira.equilibria.profiles.LaoPolynomialFunc

Function object for a Lao polynomial profile

Parameters:

coeffs (numpy.typing.ArrayLike)

_fact = 1
_order = 3
n
coeffs
static _dfunc(x: float, *args) float
Parameters:

x (float)

Return type:

float

class bluemira.equilibria.profiles.LuxonExpFunc(coeffs: numpy.typing.ArrayLike)

Bases: ShapeFunction

Inheritance diagram of bluemira.equilibria.profiles.LuxonExpFunc

Function object for a Luxon exponential profile

Parameters:

coeffs (numpy.typing.ArrayLike)

_fact = 1
_order = 1
static _dfunc(x: float, *args) float
Parameters:

x (float)

Return type:

float

class bluemira.equilibria.profiles.BetaIpProfile(betap: float, I_p: float, R_0: float, B_0: float, shape: ShapeFunction | None = None)

Bases: Profile

Inheritance diagram of bluemira.equilibria.profiles.BetaIpProfile

Constrain poloidal Beta and plasma current following logic as laid out in Jeon, 2015 and following some implementation in B. Dudson, FreeGS: https://github.com/bendudson/freegs

Parameters:
  • betap (float) – Plasma poloidal beta constraint

  • I_p (float) – Plasma current constraint [A]

  • R_0 (float) – Reactor major radius [m] (used in p’ and ff’ components)

  • B_0 (float) – Toroidal field at reactor major radius [T]

  • shape (ShapeFunction | None) – Shape parameterisation to use

Notes

\(J_{\phi} = {\lambda}\bigg({\beta}_{0}\dfrac{X}{R_{0}}+\) \((1-\beta_{0})\dfrac{R_{0}}{X}\bigg)j_{\phi_{shape}}(m, n, ..)\)

\(I_{p}=\int_{{\Omega}_{pl}} J_{{\phi},pl}({\lambda},{\beta_{0}})\) \(d{\Omega}\)

\({\beta}_{p}=\dfrac{\langle p({\beta_{0}})\rangle}{\langle B_{p}^{2}\rangle_{\psi_{a}}/2\mu_{0}}\)

Please be careful, the beta_p approximation used here is less good for higher elongation plasmas, see _calc_beta_p_approx.

betap
I_p
_fvac
R_0
_B_0
scale = 1.0
jtor(x: numpy.typing.NDArray[numpy.float64], z: numpy.typing.NDArray[numpy.float64], psi: numpy.typing.NDArray[numpy.float64], o_points: list[bluemira.equilibria.find.Opoint], x_points: list[bluemira.equilibria.find.Xpoint], *, o_point_fallback: bluemira.equilibria.find.OPointCalcOptions = OPointCalcOptions.RAISE) numpy.typing.NDArray[numpy.float64]

Calculate toroidal plasma current array.

\(I_{p} =\int\int {\lambda}\bigg({\beta}_{0}\dfrac{X}{R_{0}}j_{\phi_{shape}}+\) \((1-\beta_{0})\dfrac{R_{0}}{X}j_{\phi_{shape}}\bigg)\)

\({\beta}_{p}=\dfrac{8\pi}{{\mu}_{0}{I_{p}^{2}}}\int\int pdXdZ\) \(= -\dfrac{8\pi}{{\mu}_{0}{I_{p}^{2}}}\dfrac{\lambda{\beta}_{0}}{R_{0}}\int\int p_{shape}dXdZ\)

\(p(\psi_{N})=-\dfrac{\lambda\beta_{0}}{R_{0}}p_{shape}(\psi_{N})\)

\(\lambda{\beta_{0}}=-\dfrac{\beta_{p}I_{p}^{2}R_{0}\mu_{0}}{8\pi \int\int p_{shape}}\)

\(\lambda=\dfrac{I_{p}-\lambda{\beta_{0}}\bigg(\int\int\dfrac{X}{R_{0}}f+\int\int\dfrac{R_{0}}{X}f\bigg)}{\int\int\dfrac{R_{0}}{X}f}\)

Derivation: book 10, p 120

Note

Please be careful, the beta_p approximation used here is not good for high elongation plasmas, see _calc_beta_p_approx.

Parameters:
Return type:

numpy.typing.NDArray[numpy.float64]

pprime(pn: numpy.typing.ArrayLike) float | numpy.typing.NDArray[numpy.float64]

dp/dpsi as a function of normalised psi

Parameters:

pn (numpy.typing.ArrayLike)

Return type:

float | numpy.typing.NDArray[numpy.float64]

ffprime(pn: numpy.typing.ArrayLike) float | numpy.typing.NDArray[numpy.float64]

f*df/dpsi as a function of normalised psi

Parameters:

pn (numpy.typing.ArrayLike)

Return type:

float | numpy.typing.NDArray[numpy.float64]

class bluemira.equilibria.profiles.CustomProfile(pprime_func: numpy.typing.NDArray[numpy.float64] | collections.abc.Callable[[float]] | float, ffprime_func: numpy.typing.NDArray[numpy.float64] | collections.abc.Callable[[float]] | float, R_0: float, B_0: float, p_func: numpy.typing.NDArray[numpy.float64] | collections.abc.Callable[[float]] | float | None = None, f_func: numpy.typing.NDArray[numpy.float64] | collections.abc.Callable[[float]] | float | None = None, I_p: float | None = None)

Bases: Profile

Inheritance diagram of bluemira.equilibria.profiles.CustomProfile

User-specified profile functions p’(psi), ff’(psi) jtor = R*p’ + ff’/(R*MU_0)

Parameters:
  • pprime_func (numpy.typing.NDArray[numpy.float64] | collections.abc.Callable[[float]] | float) – Pressure prime profile - dp/dpsi(psi_N)

  • ffprime_func (numpy.typing.NDArray[numpy.float64] | collections.abc.Callable[[float]] | float) – Force-Force prime profile f*df/dpsi(psi_N)

  • R_0 (float) – Reactor major radius [m]

  • B_0 (float) – Field at major radius [T]

  • I_p (float | None) – Plasma current [A]. If None, the plasma current will be calculated from p’ and ff’.

  • p_func (numpy.typing.NDArray[numpy.float64] | collections.abc.Callable[[float]] | float | None)

  • f_func (numpy.typing.NDArray[numpy.float64] | collections.abc.Callable[[float]] | float | None)

_pprime_in
_ffprime_in
p_func = None
f_func = None
_fvac
R_0
_B_0
I_p = None
scale = 1.0
shape
static parse_to_callable(unknown)

Make a callable out of an unknown input type

Raises:

TypeError – Cannot make opject callable

pprime(pn: numpy.typing.ArrayLike) float | numpy.typing.NDArray[numpy.float64]

dp/dpsi as a function of normalised psi

Parameters:

pn (numpy.typing.ArrayLike)

Return type:

float | numpy.typing.NDArray[numpy.float64]

ffprime(pn: numpy.typing.ArrayLike) float | numpy.typing.NDArray[numpy.float64]

f*df/dpsi as a function of normalised psi

Parameters:

pn (numpy.typing.ArrayLike)

Return type:

float | numpy.typing.NDArray[numpy.float64]

jtor(x: numpy.typing.NDArray[numpy.float64], z: numpy.typing.NDArray[numpy.float64], psi: numpy.typing.NDArray[numpy.float64], o_points: list[bluemira.equilibria.find.Opoint], x_points: list[bluemira.equilibria.find.Xpoint], lcfs: numpy.typing.NDArray[numpy.float64] | None = None, *, o_point_fallback: bluemira.equilibria.find.OPointCalcOptions = OPointCalcOptions.RAISE) numpy.typing.NDArray[numpy.float64]

Calculate toroidal plasma current

\(J_{\phi}=Xp^{'}+\dfrac{FF^{'}}{\mu_{0}X}\)

Parameters:
Return type:

numpy.typing.NDArray[numpy.float64]

pressure(psinorm: numpy.typing.ArrayLike) float | numpy.typing.NDArray[numpy.float64]
Returns:

Pressure [Pa] at given value(s) of normalised psi

Parameters:

psinorm (numpy.typing.ArrayLike)

Return type:

float | numpy.typing.NDArray[numpy.float64]

fRBpol(psinorm: numpy.typing.ArrayLike) float | numpy.typing.NDArray[numpy.float64]
Returns:

f=R*Bt at given value(s) of normalised psi

Parameters:

psinorm (numpy.typing.ArrayLike)

Return type:

float | numpy.typing.NDArray[numpy.float64]

classmethod from_eqdsk_file(filename: pathlib.Path | str, from_cocos: int | None = 11, to_cocos: int | None = BLUEMIRA_DEFAULT_COCOS, *, qpsi_positive: bool | None = None, **kwargs) CustomProfile

Initialises a CustomProfile object from an eqdsk file

Parameters:
  • filename (pathlib.Path | str)

  • from_cocos (int | None)

  • to_cocos (int | None)

  • qpsi_positive (bool | None)

Return type:

CustomProfile

classmethod from_eqdsk(eq: eqdsk.EQDSKInterface) CustomProfile

Initialises a CustomProfile object from an eqdsk object

Parameters:

eq (eqdsk.EQDSKInterface)

Return type:

CustomProfile