bluemira.equilibria.profiles
Plasma profile objects, shape functions, and associated tools
Classes
Function object for a single power profile |
|
Function object for a double power profile |
|
Function object for a Lao polynomial profile |
|
Function object for a Luxon exponential profile |
|
Constrain poloidal Beta and plasma current following logic as laid out in |
|
User-specified profile functions p'(psi), ff'(psi) |
Module Contents
- class bluemira.equilibria.profiles.SinglePowerFunc(args)
Bases:
ShapeFunctionFunction 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:
ShapeFunctionFunction 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:
ShapeFunctionFunction 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:
ShapeFunctionFunction 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:
ProfileConstrain 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:
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)
- 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:
ProfileUser-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:
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)
o_point_fallback (bluemira.equilibria.find.OPointCalcOptions)
- 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:
- classmethod from_eqdsk(eq: eqdsk.EQDSKInterface) CustomProfile
Initialises a CustomProfile object from an eqdsk object
- Parameters:
eq (eqdsk.EQDSKInterface)
- Return type: