bluemira.equilibria.physics

A collection of simple equilibrium physics calculations

Classes

EqSummary

Calculates interesting values in one go.

Functions

calc_psi_norm(...)

Calculate normalised magnetic flux.

calc_psi(→ float | numpy.typing.NDArray[numpy.float64])

Calculate the absolute psi values from normalised psi values

calc_tau_flattop(→ float)

Calculates the flat-top length

calc_psib(→ float)

Calculates the boundary flux at start of flat-top, after the breakdown

calc_k0(→ float)

Calculates the plasma elongation on the plasma axis (rho = 0).

calc_q0(→ float)

Calculates the plasma MHD safety factor on the plasma axis (rho=0).

calc_dx_sep(→ float)

Calculate the magnitude of the minimum separation between the flux

calc_volume(→ float)

Calculates plasma volume [m^3]

_calc_Bp2_int(→ float)

Calculates the volume integral of the poloidal field squared.

_calc_p_int(→ float)

Calculates the volume integral of plasma pressure.

calc_energy(→ float)

Calculates the stored poloidal magnetic energy in the plasma [J]

_calc_Li_from_energy(→ float)

Calculates the internal inductance of the plasma [H]

calc_Li(→ float)

Calculates the internal inductance of the plasma [H]

_calc_li_from_Li(→ float)

Calculates the normalised internal inductance of the plasma

calc_li(→ float)

Calculates the normalised internal inductance of the plasma

calc_li3(→ float)

Calculates the normalised internal plasma inductance (ITER approximate

_calc_li3minargs(→ float)

Calculate the normalised plasma internal inductance with arguments only.

calc_p_average(→ float)

Calculate the average plasma pressure.

_calc_p_average(→ float)

Calculate the average plasma pressure.

calc_beta_t(→ float)

Calculate the ratio of plasma pressure to toroidal magnetic pressure.

_calc_beta_t(→ float)

Calculate the ratio of plasma pressure to toroidal magnetic pressure.

calc_beta_p(→ float)

Calculate the ratio of plasma pressure to poloidal magnetic pressure

calc_beta_p_approximate(→ float)

Calculate the ratio of plasma pressure to magnetic pressure. This is

_calc_beta_p(→ float)

Calculate the ratio of plasma pressure to poloidal magnetic pressure

_calc_beta_p_approx(→ float)

Calculate the ratio of plasma pressure to magnetic pressure. This is

beta(→ float)

The ratio of plasma pressure to magnetic pressure

normalise_beta(→ float)

Converts beta to normalised beta

beta_N_to_beta(→ float)

Converts normalised beta to beta

calc_infinite_solenoid_flux(→ float)

Calculate the maximum flux achievable from an infinite solenoid given a peak field.

Module Contents

bluemira.equilibria.physics.calc_psi_norm(psi: numpy.typing.ArrayLike, opsi: float, xpsi: float) float | numpy.typing.NDArray[numpy.float64]

Calculate normalised magnetic flux.

\(\dfrac{\psi_{O}-\psi}{\psi_{O}-\psi_{X}}\)

Parameters:
  • psi (numpy.typing.ArrayLike) – The magnetic flux per radian

  • opsi (float) – The psi value at the O-point

  • xpsi (float) – The psi value at the X-point

Return type:

The normalised magnetic flux value(s)

bluemira.equilibria.physics.calc_psi(psi_norm: numpy.typing.ArrayLike, opsi: float, xpsi: float) float | numpy.typing.NDArray[numpy.float64]

Calculate the absolute psi values from normalised psi values

\(\psi_{O}-\psi_{norm}(\psi_{O}-\psi_{X})\)

Parameters:
  • psi_norm (numpy.typing.ArrayLike) – The normalised psi values

  • opsi (float) – The psi value at the O-point

  • xpsi (float) – The psi value at the X-point

Returns:

The magnetic flux per radian

Return type:

psi

bluemira.equilibria.physics.calc_tau_flattop(psi_sof: float, psi_eof: float, v_burn: float) float

Calculates the flat-top length

\(\tau_{flat-top}=\dfrac{\psi_{SOF}-\psi_{EOF}}{V_{burn}}\)

Parameters:
  • psi_sof (float) – The start of flat-top magnetic flux at the plasma boundary [V.s]

  • psi_eof (float) – The end of flat-top magnetic flux at the plasma boundary [V.s]

  • v_burn (float) – The plasma loop voltage during burn [V]

Return type:

The duration of the flat-top [s]

bluemira.equilibria.physics.calc_psib(psi_bd: float, R_0: float, I_p: float, li: float, c_ejima: float = 0.4) float

Calculates the boundary flux at start of flat-top, after the breakdown

\(\psi_b=\psi(t_{BD})-L_i I_p-\Delta\psi_{res}\)

with:

\(L_i=\dfrac{\mu_0R_0l_i}{2}\)

\(\Delta\psi_{res}=C_{Ejima}\mu_0R_0I_p\)

Parameters:
  • psi_bd (float) – The flux at the breakdown [V.s]

  • R_0 (float) – The machine major radius [m]

  • I_p (float) – The desired flat-top plasma current [A]

  • li (float) – The normalised plasma inductance

  • c_ejima (float)

Return type:

The flux at the boundary at start of flat-top [V.s]

bluemira.equilibria.physics.calc_k0(psi_xx0: float, psi_zz0: float) float

Calculates the plasma elongation on the plasma axis (rho = 0).

Parameters:
  • psi_xx0 (float) – Second derivative of psi in X at the plasma axis (R_0, Z_0)

  • psi_zz0 (float) – Second derivative of psi in Z at the plasma axis (R_0, Z_0)

Return type:

Plasma elongation at the plasma axis

bluemira.equilibria.physics.calc_q0(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculates the plasma MHD safety factor on the plasma axis (rho=0). Freidberg, Ideal MHD, eq 6.42, p 134

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – Equilibrium for which to calculate the safety factor on axis

Return type:

The MHD safety factor on the plasma axis

bluemira.equilibria.physics.calc_dx_sep(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculate the magnitude of the minimum separation between the flux surfaces of null points in the equilibrium at the outboard midplane.

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – Equilibrium for which to calculate dx_sep

Returns:

  • Separation distance at the outboard midplane between the active

  • null and the next closest flux surface with a null [m]

Return type:

float

bluemira.equilibria.physics.calc_volume(fs: bluemira.geometry.coordinates.Coordinates) float

Calculates plasma volume [m^3]

Parameters:

fs (bluemira.geometry.coordinates.Coordinates) – Closed flux surface

Return type:

Plasma volume within closed flux surface

bluemira.equilibria.physics._calc_Bp2_int(Bp: numpy.typing.NDArray[numpy.float64], mask: numpy.typing.NDArray[numpy.float64] | None, x: numpy.typing.NDArray[numpy.float64], dx: numpy.typing.NDArray[numpy.float64], dz: numpy.typing.NDArray[numpy.float64]) float

Calculates the volume integral of the poloidal field squared.

Parameters:
  • Bp (numpy.typing.NDArray[numpy.float64]) – Poloidal field at x and z-coordinates

  • mask (numpy.typing.NDArray[numpy.float64] | None) – Mask for chosen closed flux surface

  • x (numpy.typing.NDArray[numpy.float64]) – X-coordinates

  • dx (numpy.typing.NDArray[numpy.float64]) – Discretisation size in the x-coordinate

  • dz (numpy.typing.NDArray[numpy.float64]) – Discretisation size in the z-coordinate

Return type:

volume integral (masked if chosen)

bluemira.equilibria.physics._calc_p_int(p: numpy.typing.NDArray[numpy.float64], x: numpy.typing.NDArray[numpy.float64], dx: numpy.typing.NDArray[numpy.float64], dz: numpy.typing.NDArray[numpy.float64]) float

Calculates the volume integral of plasma pressure.

Parameters:
  • p (numpy.typing.NDArray[numpy.float64]) – Plasma pressure

  • x (numpy.typing.NDArray[numpy.float64]) – X-coordinates

  • dx (numpy.typing.NDArray[numpy.float64]) – Discretisation size in the x-coordinate

  • dz (numpy.typing.NDArray[numpy.float64]) – Discretisation size in the z-coordinate

Return type:

volume integral

bluemira.equilibria.physics.calc_energy(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculates the stored poloidal magnetic energy in the plasma [J]

\(W=\dfrac{LI^2}{2}\)

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – The Equilibrium object for which to calculate stored energy

Return type:

Stored poloidal magnetic energy

bluemira.equilibria.physics._calc_Li_from_energy(bp_energy: float, i_p: float) float

Calculates the internal inductance of the plasma [H]

Parameters:
  • bp_energy (float) – Poloidal magnetic energy

  • i_p (float) – Plasma current

Return type:

Internal inductance of the plasma

bluemira.equilibria.physics.calc_Li(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculates the internal inductance of the plasma [H]

\(L_i=\dfrac{2W}{I_{p}^{2}}\)

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – The Equilibrium object for which to calculate internal inductance

Return type:

Internal inductance of the plasma

bluemira.equilibria.physics._calc_li_from_Li(big_li: float, R_0: float) float

Calculates the normalised internal inductance of the plasma

\(l_i=\dfrac{2L_i}{\mu_{0}R_{0}}\)

Parameters:
  • big_li (float) – Internal inductance of plasma

  • R_0 (float) – Major Radius

Return type:

Normalised internal inductance of the plasma

bluemira.equilibria.physics.calc_li(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculates the normalised internal inductance of the plasma

\(l_i=\dfrac{2L_i}{\mu_{0}R_{0}}\)

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – The Equilibrium object for which to calculate internal inductance

Return type:

Normalised internal inductance of the plasma

bluemira.equilibria.physics.calc_li3(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculates the normalised internal plasma inductance (ITER approximate calculation)

see DOI: 10.1088/0029-5515/48/12/125002

\(li(3)=\dfrac{2V\langle B_p^2\rangle}{(\mu_0I_p)^2R_0}\)

with:

\(\langle B_p^2\rangle=\dfrac{1}{V}\int B_p^2dV\)

where: Bp is the poloidal magnetic field and V is the plasma volume

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – The Equilibrium object for which to calculate internal inductance

Return type:

Approximate normalised internal inductance of the plasma

bluemira.equilibria.physics._calc_li3minargs(x: numpy.typing.NDArray[numpy.float64], z: numpy.typing.NDArray[numpy.float64], psi: numpy.typing.NDArray[numpy.float64], Bp: numpy.typing.NDArray[numpy.float64], R_0: float, I_p: float, dx: float, dz: float, mask: numpy.typing.NDArray[numpy.float64] | None = None, o_points: collections.abc.Iterable[bluemira.equilibria.find.Opoint] | None = None, x_points: collections.abc.Iterable[bluemira.equilibria.find.Xpoint] | None = None) float

Calculate the normalised plasma internal inductance with arguments only.

\(\dfrac{2 B_{p, average}}{R_{0} (\mu_{0} I_{p})**2}\)

Used in the optimisation of the plasma profiles.

Parameters:
  • x (numpy.typing.NDArray[numpy.float64]) – X-coordinates

  • z (numpy.typing.NDArray[numpy.float64]) – Z-coordinates

  • psi (numpy.typing.NDArray[numpy.float64]) – The poloidal magnetic flux map [V.s/rad]

  • Bp (numpy.typing.NDArray[numpy.float64]) – Poloidal field at x and z-coordinates

  • R_0 (float) – Major radius

  • I_p (float) – Plasma current

  • dx (float) – Discretisation size in the x-coordinate

  • dz (float) – Discretisation size in the z-coordinate

  • mask (numpy.typing.NDArray[numpy.float64] | None) – Mask for chosen closed flux surface

  • o_points (collections.abc.Iterable[bluemira.equilibria.find.Opoint] | None) – O-points to use to calculate psinorm

  • x_points (collections.abc.Iterable[bluemira.equilibria.find.Xpoint] | None) – X-points to use to calculate psinorm

Return type:

Approximate normalised internal inductance of the plasma

bluemira.equilibria.physics.calc_p_average(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculate the average plasma pressure.

\(\langle p \rangle = \dfrac{1}{V_{p}}\int \mathbf{p}dxdz\):

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – The Equilibrium object for which to calculate p_average

Return type:

The average plasma pressure [Pa]

bluemira.equilibria.physics._calc_p_average(pressure_map: numpy.typing.NDArray, fs: numpy.typing.NDArray[numpy.float64], x: numpy.typing.NDArray[numpy.float64], dx: float, dz: float) float

Calculate the average plasma pressure.

\(\langle p \rangle = \dfrac{1}{V_{p}}\int \mathbf{p}dxdz\):

Parameters:
  • pressure_map (numpy.typing.NDArray) – Pressure at normalised psi values within chosen closed flux surface

  • fs (numpy.typing.NDArray[numpy.float64]) – Coordinates of the chosen closed flux surface

  • x (numpy.typing.NDArray[numpy.float64]) – X-coordinates

  • dx (float) – Discretisation size in the x-coordinate

  • dz (float) – Discretisation size in the z-coordinate

Return type:

The average plasma pressure [Pa]

bluemira.equilibria.physics.calc_beta_t(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculate the ratio of plasma pressure to toroidal magnetic pressure.

\(\beta_t = \dfrac{2\mu_0\langle p \rangle}{B_t^2}\)

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – The Equilibrium object for which to calculate beta_t

Return type:

Ratio of plasma to toroidal magnetic pressure

bluemira.equilibria.physics._calc_beta_t(pressure_map: numpy.typing.NDArray[numpy.float64], fs: numpy.typing.NDArray[numpy.float64], x: numpy.typing.NDArray[numpy.float64], dx: float, dz: float, B_0: float) float

Calculate the ratio of plasma pressure to toroidal magnetic pressure.

\(\beta_t = \dfrac{2\mu_0\langle p \rangle}{B_t^2}\)

Parameters:
  • pressure_map (numpy.typing.NDArray[numpy.float64]) – Pressure at normalised psi values within chosen closed flux surface

  • fs (numpy.typing.NDArray[numpy.float64]) – Coordinates of the chosen closed flux surface

  • x (numpy.typing.NDArray[numpy.float64]) – X-coordinates

  • dx (float) – Discretisation size in the x-coordinate

  • dz (float) – Discretisation size in the z-coordinate

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

Return type:

Ratio of plasma to toroidal magnetic pressure

bluemira.equilibria.physics.calc_beta_p(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculate the ratio of plasma pressure to poloidal magnetic pressure

\(\beta_p = \dfrac{2\mu_0\langle p \rangle}{B_p^2}\)

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – The Equilibrium object for which to calculate beta_p

Return type:

Ratio of plasma to magnetic pressure

bluemira.equilibria.physics.calc_beta_p_approximate(eq: bluemira.equilibria.equilibrium.Equilibrium) float

Calculate the ratio of plasma pressure to magnetic pressure. This is following the definitions of Friedberg, Ideal MHD, pp. 68-69, which is an approximation.

\(\beta_p = \dfrac{2\mu_0\langle p \rangle}{B_p^2}\)

Note

Be careful, this approximation is not good for high elongation plasmas, try comparing to calc_beta_p before using.

Parameters:

eq (bluemira.equilibria.equilibrium.Equilibrium) – The Equilibrium object for which to calculate beta_p

Return type:

Ratio of plasma to poloidal magnetic pressure

bluemira.equilibria.physics._calc_beta_p(pressure_map: numpy.typing.NDArray[numpy.float64], Bp: numpy.typing.NDArray[numpy.float64], mask: numpy.typing.NDArray[numpy.float64], x: numpy.typing.NDArray[numpy.float64], dx: float, dz: float) float

Calculate the ratio of plasma pressure to poloidal magnetic pressure

\(\beta_p = \dfrac{2\mu_0\langle p \rangle}{B_p^2}\)

Parameters:
  • pressure_map (numpy.typing.NDArray[numpy.float64]) – Pressure at normalised psi values within chosen closed flux surface

  • Bp (numpy.typing.NDArray[numpy.float64]) – Poloidal field at x and z-coordinates

  • mask (numpy.typing.NDArray[numpy.float64]) – Mask for chosen closed flux surface

  • x (numpy.typing.NDArray[numpy.float64]) – X-coordinates

  • dx (float) – Discretisation size in the x-coordinate

  • dz (float) – Discretisation size in the z-coordinate

Return type:

Ratio of plasma to magnetic pressure

bluemira.equilibria.physics._calc_beta_p_approx(pressure_map: numpy.typing.NDArray[numpy.float64], fs: numpy.typing.NDArray[numpy.float64], x: numpy.typing.NDArray[numpy.float64], dx: float, dz: float, I_p: float) float

Calculate the ratio of plasma pressure to magnetic pressure. This is following the definitions of Friedberg, Ideal MHD, pp. 68-69, which is an approximation.

\(\beta_p = \dfrac{2\mu_0\langle p \rangle}{B_p^2}\)

Note

Be careful, this approximation is not good for high elongation plasmas, try comparing to calc_beta_p before using.

Parameters:
  • pressure_map (numpy.typing.NDArray[numpy.float64]) – Pressure at normalised psi values within chosen closed flux surface

  • fs (numpy.typing.NDArray[numpy.float64]) – Coordinates of the chosen closed flux surface

  • x (numpy.typing.NDArray[numpy.float64]) – X-coordinates

  • dx (float) – Discretisation size in the x-coordinate

  • dz (float) – Discretisation size in the z-coordinate

  • I_p (float) – Plasma current

Return type:

Ratio of plasma to poloidal magnetic pressure

class bluemira.equilibria.physics.EqSummary

Bases: bluemira.base.parameter_frame._frame.ParameterFrame

Inheritance diagram of bluemira.equilibria.physics.EqSummary

Calculates interesting values in one go.

W: bluemira.base.parameter_frame._parameter.Parameter[float]
Li: bluemira.base.parameter_frame._parameter.Parameter[float]
li: bluemira.base.parameter_frame._parameter.Parameter[float]
li_3: bluemira.base.parameter_frame._parameter.Parameter[float]
V: bluemira.base.parameter_frame._parameter.Parameter[float]
beta_p: bluemira.base.parameter_frame._parameter.Parameter[float]
q_95: bluemira.base.parameter_frame._parameter.Parameter[float]
kappa_95: bluemira.base.parameter_frame._parameter.Parameter[float]
delta_95: bluemira.base.parameter_frame._parameter.Parameter[float]
zeta_95: bluemira.base.parameter_frame._parameter.Parameter[float]
kappa: bluemira.base.parameter_frame._parameter.Parameter[float]
delta: bluemira.base.parameter_frame._parameter.Parameter[float]
zeta: bluemira.base.parameter_frame._parameter.Parameter[float]
R_0: bluemira.base.parameter_frame._parameter.Parameter[float]
A: bluemira.base.parameter_frame._parameter.Parameter[float]
a: bluemira.base.parameter_frame._parameter.Parameter[float]
I_p: bluemira.base.parameter_frame._parameter.Parameter[float]
dx_shaf: bluemira.base.parameter_frame._parameter.Parameter[float]
dz_shaf: bluemira.base.parameter_frame._parameter.Parameter[float]
classmethod from_equilibrium(eq: bluemira.equilibria.equilibrium.Equilibrium, f95: bluemira.equilibria.flux_surfaces.ClosedFluxSurface, f100: bluemira.equilibria.flux_surfaces.ClosedFluxSurface, *, is_double_null: bool)

Create summary from equilibrium

Parameters:
bluemira.equilibria.physics.beta(pressure: numpy.typing.NDArray[numpy.float64], field: float) float

The ratio of plasma pressure to magnetic pressure

\(\beta = \dfrac{\langle p \rangle}{B^2/2\mu_0}\)

Parameters:
  • pressure (numpy.typing.NDArray[numpy.float64]) – Plasma pressure, from which the mean is to be calculated [Pa]

  • field (float) – Mean total field strength [T]

Return type:

Ratio of plasma to magnetic pressure

bluemira.equilibria.physics.normalise_beta(beta: float, a: float, b_tor: float, I_p: float) float

Converts beta to normalised beta

\(\beta_{N} = \beta\dfrac{aB_{T}}{I_{p}}\)

Parameters:
  • beta (float) – Ratio of plasma to magnetic pressure

  • a (float) – Plasma minor radius [m]

  • b_tor (float) – Toroidal field [T]

  • I_p (float) – Plasma current [A]

Return type:

Normalised ratio of plasma to magnetic pressure (Troyon factor)

bluemira.equilibria.physics.beta_N_to_beta(beta_N: float, a: float, Btor: float, I_p: float) float

Converts normalised beta to beta

\(\beta = \beta_{N}\dfrac{I_{p}}{aB_{T}}\)

Parameters:
  • beta_N (float) – Normalised ratio of plasma to magnetic pressure (Troyon factor)

  • a (float) – Plasma minor radius [m]

  • Btor (float) – Toroidal field [T]

  • I_p (float) – Plasma current [A]

Return type:

Ratio of plasma to magnetic pressure

bluemira.equilibria.physics.calc_infinite_solenoid_flux(r_cs_min: float, r_cs_max: float, B_max: float) float

Calculate the maximum flux achievable from an infinite solenoid given a peak field.

\[B_{max} \dfrac{\pi}{3} (r_{cs, max}**2 r_{cs, min}**2 + r_{cs, max} r_{cs, min})\]
Parameters:
  • r_cs_min (float) – Inner radius of the infinite solenoid [m]

  • r_cs_max (float) – Outer radius of the infinite solenoid [m]

  • B_max (float) – Peak allowable field in the solenoid [T]

Return type:

Maximum achievable flux from an infinite solenoid [V.s]