bluemira.equilibria.physics =========================== .. py:module:: bluemira.equilibria.physics .. autoapi-nested-parse:: A collection of simple equilibrium physics calculations Classes ------- .. autoapisummary:: bluemira.equilibria.physics.EqSummary Functions --------- .. autoapisummary:: bluemira.equilibria.physics.calc_psi_norm bluemira.equilibria.physics.calc_psi bluemira.equilibria.physics.calc_tau_flattop bluemira.equilibria.physics.calc_psib bluemira.equilibria.physics.calc_k0 bluemira.equilibria.physics.calc_q0 bluemira.equilibria.physics.calc_dx_sep bluemira.equilibria.physics.calc_volume bluemira.equilibria.physics._calc_Bp2_int bluemira.equilibria.physics._calc_p_int bluemira.equilibria.physics.calc_energy bluemira.equilibria.physics._calc_Li_from_energy bluemira.equilibria.physics.calc_Li bluemira.equilibria.physics._calc_li_from_Li bluemira.equilibria.physics.calc_li bluemira.equilibria.physics.calc_li3 bluemira.equilibria.physics._calc_li3minargs bluemira.equilibria.physics.calc_p_average bluemira.equilibria.physics._calc_p_average bluemira.equilibria.physics.calc_beta_t bluemira.equilibria.physics._calc_beta_t bluemira.equilibria.physics.calc_beta_p bluemira.equilibria.physics.calc_beta_p_approximate bluemira.equilibria.physics._calc_beta_p bluemira.equilibria.physics._calc_beta_p_approx bluemira.equilibria.physics.beta bluemira.equilibria.physics.normalise_beta bluemira.equilibria.physics.beta_N_to_beta bluemira.equilibria.physics.calc_infinite_solenoid_flux Module Contents --------------- .. py:function:: calc_psi_norm(psi: numpy.typing.ArrayLike, opsi: float, xpsi: float) -> float | numpy.typing.NDArray[numpy.float64] Calculate normalised magnetic flux. :math:`\dfrac{\psi_{O}-\psi}{\psi_{O}-\psi_{X}}` :param psi: The magnetic flux per radian :param opsi: The psi value at the O-point :param xpsi: The psi value at the X-point :rtype: The normalised magnetic flux value(s) .. py:function:: 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 :math:`\psi_{O}-\psi_{norm}(\psi_{O}-\psi_{X})` :param psi_norm: The normalised psi values :param opsi: The psi value at the O-point :param xpsi: The psi value at the X-point :returns: The magnetic flux per radian :rtype: psi .. py:function:: calc_tau_flattop(psi_sof: float, psi_eof: float, v_burn: float) -> float Calculates the flat-top length :math:`\tau_{flat-top}=\dfrac{\psi_{SOF}-\psi_{EOF}}{V_{burn}}` :param psi_sof: The start of flat-top magnetic flux at the plasma boundary [V.s] :param psi_eof: The end of flat-top magnetic flux at the plasma boundary [V.s] :param v_burn: The plasma loop voltage during burn [V] :rtype: The duration of the flat-top [s] .. py:function:: 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 :math:`\psi_b=\psi(t_{BD})-L_i I_p-\Delta\psi_{res}` with: :math:`L_i=\dfrac{\mu_0R_0l_i}{2}` :math:`\Delta\psi_{res}=C_{Ejima}\mu_0R_0I_p` :param psi_bd: The flux at the breakdown [V.s] :param R_0: The machine major radius [m] :param I_p: The desired flat-top plasma current [A] :param li: The normalised plasma inductance :rtype: The flux at the boundary at start of flat-top [V.s] .. py:function:: calc_k0(psi_xx0: float, psi_zz0: float) -> float Calculates the plasma elongation on the plasma axis (rho = 0). :param psi_xx0: Second derivative of psi in X at the plasma axis (R_0, Z_0) :param psi_zz0: Second derivative of psi in Z at the plasma axis (R_0, Z_0) :rtype: Plasma elongation at the plasma axis .. py:function:: 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 :param eq: Equilibrium for which to calculate the safety factor on axis :rtype: The MHD safety factor on the plasma axis .. py:function:: 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. :param eq: 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]* .. py:function:: calc_volume(fs: bluemira.geometry.coordinates.Coordinates) -> float Calculates plasma volume [m^3] :param fs: Closed flux surface :rtype: Plasma volume within closed flux surface .. py:function:: _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. :param Bp: Poloidal field at x and z-coordinates :param mask: Mask for chosen closed flux surface :param x: X-coordinates :param dx: Discretisation size in the x-coordinate :param dz: Discretisation size in the z-coordinate :rtype: volume integral (masked if chosen) .. py:function:: _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. :param p: Plasma pressure :param x: X-coordinates :param dx: Discretisation size in the x-coordinate :param dz: Discretisation size in the z-coordinate :rtype: volume integral .. py:function:: calc_energy(eq: bluemira.equilibria.equilibrium.Equilibrium) -> float Calculates the stored poloidal magnetic energy in the plasma [J] :math:`W=\dfrac{LI^2}{2}` :param eq: The Equilibrium object for which to calculate stored energy :rtype: Stored poloidal magnetic energy .. py:function:: _calc_Li_from_energy(bp_energy: float, i_p: float) -> float Calculates the internal inductance of the plasma [H] :param bp_energy: Poloidal magnetic energy :param i_p: Plasma current :rtype: Internal inductance of the plasma .. py:function:: calc_Li(eq: bluemira.equilibria.equilibrium.Equilibrium) -> float Calculates the internal inductance of the plasma [H] :math:`L_i=\dfrac{2W}{I_{p}^{2}}` :param eq: The Equilibrium object for which to calculate internal inductance :rtype: Internal inductance of the plasma .. py:function:: _calc_li_from_Li(big_li: float, R_0: float) -> float Calculates the normalised internal inductance of the plasma :math:`l_i=\dfrac{2L_i}{\mu_{0}R_{0}}` :param big_li: Internal inductance of plasma :param R_0: Major Radius :rtype: Normalised internal inductance of the plasma .. py:function:: calc_li(eq: bluemira.equilibria.equilibrium.Equilibrium) -> float Calculates the normalised internal inductance of the plasma :math:`l_i=\dfrac{2L_i}{\mu_{0}R_{0}}` :param eq: The Equilibrium object for which to calculate internal inductance :rtype: Normalised internal inductance of the plasma .. py:function:: 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` :math:`li(3)=\dfrac{2V\langle B_p^2\rangle}{(\mu_0I_p)^2R_0}` with: :math:`\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 :param eq: The Equilibrium object for which to calculate internal inductance :rtype: Approximate normalised internal inductance of the plasma .. py:function:: _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. :math:`\dfrac{2 B_{p, average}}{R_{0} (\mu_{0} I_{p})**2}` Used in the optimisation of the plasma profiles. :param x: X-coordinates :param z: Z-coordinates :param psi: The poloidal magnetic flux map [V.s/rad] :param Bp: Poloidal field at x and z-coordinates :param R_0: Major radius :param I_p: Plasma current :param dx: Discretisation size in the x-coordinate :param dz: Discretisation size in the z-coordinate :param mask: Mask for chosen closed flux surface :param o_points: O-points to use to calculate psinorm :param x_points: X-points to use to calculate psinorm :rtype: Approximate normalised internal inductance of the plasma .. py:function:: calc_p_average(eq: bluemira.equilibria.equilibrium.Equilibrium) -> float Calculate the average plasma pressure. :math:`\langle p \rangle = \dfrac{1}{V_{p}}\int \mathbf{p}dxdz`: :param eq: The Equilibrium object for which to calculate p_average :rtype: The average plasma pressure [Pa] .. py:function:: _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. :math:`\langle p \rangle = \dfrac{1}{V_{p}}\int \mathbf{p}dxdz`: :param pressure_map: Pressure at normalised psi values within chosen closed flux surface :param fs: Coordinates of the chosen closed flux surface :param x: X-coordinates :param dx: Discretisation size in the x-coordinate :param dz: Discretisation size in the z-coordinate :rtype: The average plasma pressure [Pa] .. py:function:: calc_beta_t(eq: bluemira.equilibria.equilibrium.Equilibrium) -> float Calculate the ratio of plasma pressure to toroidal magnetic pressure. :math:`\beta_t = \dfrac{2\mu_0\langle p \rangle}{B_t^2}` :param eq: The Equilibrium object for which to calculate beta_t :rtype: Ratio of plasma to toroidal magnetic pressure .. py:function:: _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. :math:`\beta_t = \dfrac{2\mu_0\langle p \rangle}{B_t^2}` :param pressure_map: Pressure at normalised psi values within chosen closed flux surface :param fs: Coordinates of the chosen closed flux surface :param x: X-coordinates :param dx: Discretisation size in the x-coordinate :param dz: Discretisation size in the z-coordinate :param B_0: Toroidal field at reactor major radius [T] :rtype: Ratio of plasma to toroidal magnetic pressure .. py:function:: calc_beta_p(eq: bluemira.equilibria.equilibrium.Equilibrium) -> float Calculate the ratio of plasma pressure to poloidal magnetic pressure :math:`\beta_p = \dfrac{2\mu_0\langle p \rangle}{B_p^2}` :param eq: The Equilibrium object for which to calculate beta_p :rtype: Ratio of plasma to magnetic pressure .. py:function:: 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. :math:`\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. :param eq: The Equilibrium object for which to calculate beta_p :rtype: Ratio of plasma to poloidal magnetic pressure .. py:function:: _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 :math:`\beta_p = \dfrac{2\mu_0\langle p \rangle}{B_p^2}` :param pressure_map: Pressure at normalised psi values within chosen closed flux surface :param Bp: Poloidal field at x and z-coordinates :param mask: Mask for chosen closed flux surface :param x: X-coordinates :param dx: Discretisation size in the x-coordinate :param dz: Discretisation size in the z-coordinate :rtype: Ratio of plasma to magnetic pressure .. py:function:: _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. :math:`\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. :param pressure_map: Pressure at normalised psi values within chosen closed flux surface :param fs: Coordinates of the chosen closed flux surface :param x: X-coordinates :param dx: Discretisation size in the x-coordinate :param dz: Discretisation size in the z-coordinate :param I_p: Plasma current :rtype: Ratio of plasma to poloidal magnetic pressure .. py:class:: EqSummary Bases: :py:obj:`bluemira.base.parameter_frame._frame.ParameterFrame` .. autoapi-inheritance-diagram:: bluemira.equilibria.physics.EqSummary :parts: 1 :private-bases: Calculates interesting values in one go. .. py:attribute:: W :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: Li :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: li :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: li_3 :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: V :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: beta_p :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: q_95 :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: kappa_95 :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: delta_95 :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: zeta_95 :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: kappa :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: delta :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: zeta :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: R_0 :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: A :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: a :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: I_p :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: dx_shaf :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:attribute:: dz_shaf :type: bluemira.base.parameter_frame._parameter.Parameter[float] .. py:method:: from_equilibrium(eq: bluemira.equilibria.equilibrium.Equilibrium, f95: bluemira.equilibria.flux_surfaces.ClosedFluxSurface, f100: bluemira.equilibria.flux_surfaces.ClosedFluxSurface, *, is_double_null: bool) :classmethod: Create summary from equilibrium .. py:function:: beta(pressure: numpy.typing.NDArray[numpy.float64], field: float) -> float The ratio of plasma pressure to magnetic pressure :math:`\beta = \dfrac{\langle p \rangle}{B^2/2\mu_0}` :param pressure: Plasma pressure, from which the mean is to be calculated [Pa] :param field: Mean total field strength [T] :rtype: Ratio of plasma to magnetic pressure .. py:function:: normalise_beta(beta: float, a: float, b_tor: float, I_p: float) -> float Converts beta to normalised beta :math:`\beta_{N} = \beta\dfrac{aB_{T}}{I_{p}}` :param beta: Ratio of plasma to magnetic pressure :param a: Plasma minor radius [m] :param b_tor: Toroidal field [T] :param I_p: Plasma current [A] :rtype: Normalised ratio of plasma to magnetic pressure (Troyon factor) .. py:function:: beta_N_to_beta(beta_N: float, a: float, Btor: float, I_p: float) -> float Converts normalised beta to beta :math:`\beta = \beta_{N}\dfrac{I_{p}}{aB_{T}}` :param beta_N: Normalised ratio of plasma to magnetic pressure (Troyon factor) :param a: Plasma minor radius [m] :param Btor: Toroidal field [T] :param I_p: Plasma current [A] :rtype: Ratio of plasma to magnetic pressure .. py:function:: 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. .. math:: B_{max} \dfrac{\pi}{3} (r_{cs, max}**2 r_{cs, min}**2 + r_{cs, max} r_{cs, min}) :param r_cs_min: Inner radius of the infinite solenoid [m] :param r_cs_max: Outer radius of the infinite solenoid [m] :param B_max: Peak allowable field in the solenoid [T] :rtype: Maximum achievable flux from an infinite solenoid [V.s]