Formula reference: transformer

Generated from the docstrings of vaft.formula.transformer: 8 public functions. Each entry is what vaft.formula.describe("transformer.<name>") prints. All formula categories

Overview

Romero’s reduction of Poynting’s theorem to three voltages – the boundary loop voltage $V_B$, the resistive voltage $V_R$ and the voltage $V_C$ at the current-weighted “equilibrium” flux surface – closes the plasma current and the internal inductance exactly, with no assumption about the current profile. This module holds those identities and the definitions they rest on. It owns no time derivative and no integral over time: $V_C = -\dot\psi_C$, the volt-second budget and any closure for $V_C$ belong to the process layer.

SymbolMeaningUnit
I_pplasma currentA
L_idimensional internal inductance, 2 W_int / I_p^2H
psipoloidal flux through the toroidal circle, fullWb
psi_Bpsi at the plasma boundaryWb
psi_Ccurrent-weighted flux average, int psi j dS / I_pWb
V_Bboundary loop voltage, -d psi_B / dtV
V_Cvoltage at the equilibrium surface, -d psi_C / dtV
V_Rresistive voltage, R_p (I_p - I_ni)V
R_pplasma resistanceOhm
I_ninon-inductively driven currentA

Romero’s signs throughout. $\psi$ is the full flux through the toroidal circle through a point, in weber and not per radian, and every voltage is $V = -\dot\psi$ (Lenz). In this convention $\psi_C - \psi_B = L_i I_p$ has the sign of $I_p$, and a positive $V_B$ sustains a positive $I_p$ – the same sense as the loop voltage of vaft.formula.startup.plasma_current_derivative_lumped_from_V_loop_R_p_I_p_L_p. An equilibrium stored in another COCOS must be brought to it first; the one function here that reads a flux refuses a result whose sign says it was not.

This is not the convention of vaft.formula.equilibrium.loop_voltage_from_total_flux, which is Ejima’s $+2\pi\,\dot\psi_b$ on a per-radian flux: the two differ in sign and by $2\pi$ in normalisation (#354). Feeding that function’s output in as $V_B$ turns a ramp-up into a ramp-down.

Functions

current_weighted_flux_from_psi_j_dSCurrent-weighted average of the poloidal flux over the plasma cross-section. Convention
equilibrium_surface_voltage_from_I_p_dL_i_V_RVoltage at the equilibrium flux surface, inferred from the inductance history. Convention
equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_RVoltage at the equilibrium flux surface, inferred from the current history. Convention
internal_inductance_from_psi_C_psi_B_I_pDimensional internal inductance from the equilibrium and boundary fluxes. Convention
internal_inductance_rate_from_I_p_V_R_V_CRate of change of the internal inductance, Romero’s exact balance. Convention
plasma_current_rate_from_L_i_V_B_V_C_V_RRate of change of the plasma current, Romero’s exact balance. Convention
resistive_voltage_from_R_p_I_p_I_niResistive voltage of the plasma, net of non-inductive current drive. Convention
romero_closure_rates_from_I_p_L_i_V_CB_V_B_V_R_k_tauState rates of Romero’s first-order current-diffusion closure. Empirical Convention

current_weighted_flux_from_psi_j_dS

Convention-sensitive source
current_weighted_flux_from_psi_j_dS(psi_Wb, j_phi_A_m2, dS_m2)
Show source vaft/formula/transformer.py, lines 324–383
def current_weighted_flux_from_psi_j_dS(psi_Wb, j_phi_A_m2, dS_m2):
    r"""Current-weighted average of the poloidal flux over the plasma cross-section.

    $$\psi_C = \frac{\int_\Omega \psi\,j_\phi\,dS}{\int_\Omega j_\phi\,dS}$$

    Parameters
    ----------
    psi_Wb : array_like
        Poloidal flux at each cell inside the boundary, full flux in Romero's
        sign, finite [Wb].
    j_phi_A_m2 : array_like
        Toroidal current density at the same cells, finite [A m^-2].
    dS_m2 : array_like
        Poloidal cross-section area of each cell, finite and non-negative;
        broadcast against the other two [m^2].

    Returns
    -------
    float
        $\psi_C$ [Wb].

    Raises
    ------
    ValueError
        A non-finite input, a negative cell area, arrays that do not
        broadcast, or a net enclosed current of zero.

    Convention
    ----------
    **The cells must be the plasma, not the grid.**  Cells outside the
    boundary carry vessel or coil current in a free-boundary solution and
    would pull $\psi_C$ toward the wall; mask them out, or pass
    $dS = 0$ for them.  The quadrature is the plain cell sum -- the caller
    chooses the cells, which is the one approximation this makes.

    $V_C = -\dot\psi_C$ is the voltage the other functions here take; the
    time derivative is the process layer's.

    References
    ----------
    .. [1] J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010)
           115002, eq. (34).

    See Also
    --------
    internal_inductance_from_psi_C_psi_B_I_p
    """
    psi = _finite("psi_Wb", psi_Wb)
    current_density = _finite("j_phi_A_m2", j_phi_A_m2)
    area = _finite("dS_m2", dS_m2)
    if np.any(area < 0.0):
        raise ValueError("dS_m2 must be non-negative")
    try:
        psi, current_density, area = np.broadcast_arrays(psi, current_density, area)
    except ValueError:
        raise ValueError("psi_Wb, j_phi_A_m2 and dS_m2 do not broadcast") from None
    enclosed = float(np.sum(current_density * area))
    if enclosed == 0.0:
        raise ValueError("the cells enclose no net current; psi_C is undefined")
    return float(np.sum(psi * current_density * area)) / enclosed

Current-weighted average of the poloidal flux over the plasma cross-section.

\[\psi_C = \frac{\int_\Omega \psi\,j_\phi\,dS}{\int_\Omega j_\phi\,dS}\]
NameTypeUnitDescription
psi_Wbarray_likeWb

Poloidal flux at each cell inside the boundary, full flux in Romero’s sign, finite.

j_phi_A_m2array_likeA m^-2

Toroidal current density at the same cells, finite.

dS_m2array_likem^2

Poloidal cross-section area of each cell, finite and non-negative; broadcast against the other two.

Returns
—floatWb

$\psi_C$.

Convention

The cells must be the plasma, not the grid. Cells outside the boundary carry vessel or coil current in a free-boundary solution and would pull $\psi_C$ toward the wall; mask them out, or pass $dS = 0$ for them. The quadrature is the plain cell sum – the caller chooses the cells, which is the one approximation this makes.

$V_C = -\dot\psi_C$ is the voltage the other functions here take; the time derivative is the process layer’s.

Raises

  • ValueError A non-finite input, a negative cell area, arrays that do not broadcast, or a net enclosed current of zero.
See Also · References

See Also

internal_inductance_from_psi_C_psi_B_I_p

References

  1. J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010) 115002, eq. (34).

equilibrium_surface_voltage_from_I_p_dL_i_V_R

Convention-sensitive source
equilibrium_surface_voltage_from_I_p_dL_i_V_R(I_p_A, dL_i_dt_H_s, V_R_V)
Show source vaft/formula/transformer.py, lines 223–269
def equilibrium_surface_voltage_from_I_p_dL_i_V_R(I_p_A, dL_i_dt_H_s, V_R_V):
    r"""Voltage at the equilibrium flux surface, inferred from the inductance history.

    $$V_C^{(L)} = V_R - \frac{I_p}{2}\,\dot L_i$$

    Parameters
    ----------
    I_p_A : float or np.ndarray
        Plasma current, finite [A].
    dL_i_dt_H_s : float or np.ndarray
        Rate of change of the internal inductance, finite [H/s].
    V_R_V : float or np.ndarray
        Resistive voltage, finite [V].

    Returns
    -------
    float or np.ndarray
        $V_C$ [V].

    Raises
    ------
    ValueError
        A non-finite input.

    Convention
    ----------
    Romero's eq. (39) solved for $V_C$.  This and
    :func:`equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_R` read the same
    $V_C$ off two different measured histories, and a third route is
    $-\dot\psi_C$ from the equilibria; their disagreement is #781's first
    validation target, and it lands on whichever input is worst -- usually
    $R_p$, which enters both.

    References
    ----------
    .. [1] J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010)
           115002, eq. (39).

    See Also
    --------
    equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_R
    current_weighted_flux_from_psi_j_dS
    """
    value = _finite("V_R_V", V_R_V) - 0.5 * _finite("I_p_A", I_p_A) * _finite(
        "dL_i_dt_H_s", dL_i_dt_H_s
    )
    return _maybe_scalar(value, I_p_A, dL_i_dt_H_s, V_R_V)

Voltage at the equilibrium flux surface, inferred from the inductance history.

\[V_C^{(L)} = V_R - \frac{I_p}{2}\,\dot L_i\]
NameTypeUnitDescription
I_p_Afloat or np.ndarrayA

Plasma current, finite.

dL_i_dt_H_sfloat or np.ndarrayH/s

Rate of change of the internal inductance, finite.

V_R_Vfloat or np.ndarrayV

Resistive voltage, finite.

Returns
—float or np.ndarrayV

$V_C$.

Convention

Romero’s eq. (39) solved for $V_C$. This and equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_R read the same $V_C$ off two different measured histories, and a third route is $-\dot\psi_C$ from the equilibria; their disagreement is #781’s first validation target, and it lands on whichever input is worst – usually $R_p$, which enters both.

Raises

  • ValueError A non-finite input.
See Also · References

See Also

equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_R current_weighted_flux_from_psi_j_dS

References

  1. J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010) 115002, eq. (39).

equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_R

Convention-sensitive source
equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_R(L_i_H, dI_p_dt_A_s, V_B_V, V_R_V)
Show source vaft/formula/transformer.py, lines 272–321
def equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_R(L_i_H, dI_p_dt_A_s, V_B_V, V_R_V):
    r"""Voltage at the equilibrium flux surface, inferred from the current history.

    $$V_C^{(I)} = L_i\,\dot I_p - V_B + 2V_R$$

    Parameters
    ----------
    L_i_H : float or np.ndarray
        Dimensional internal inductance, finite and non-negative [H].
    dI_p_dt_A_s : float or np.ndarray
        Rate of change of the plasma current, finite [A/s].
    V_B_V : float or np.ndarray
        Boundary loop voltage, finite [V].
    V_R_V : float or np.ndarray
        Resistive voltage, finite [V].

    Returns
    -------
    float or np.ndarray
        $V_C$ [V].

    Raises
    ------
    ValueError
        A non-finite input or a negative internal inductance.

    Convention
    ----------
    Romero's eq. (40) solved for $V_C$; see
    :func:`equilibrium_surface_voltage_from_I_p_dL_i_V_R` for the other
    route and what their difference measures.

    References
    ----------
    .. [1] J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010)
           115002, eq. (40).

    See Also
    --------
    equilibrium_surface_voltage_from_I_p_dL_i_V_R
    """
    inductance = _finite("L_i_H", L_i_H)
    if np.any(inductance < 0.0):
        raise ValueError(f"L_i_H must be non-negative; got {L_i_H!r}")
    value = (
        inductance * _finite("dI_p_dt_A_s", dI_p_dt_A_s)
        - _finite("V_B_V", V_B_V)
        + 2.0 * _finite("V_R_V", V_R_V)
    )
    return _maybe_scalar(value, L_i_H, dI_p_dt_A_s, V_B_V, V_R_V)

Voltage at the equilibrium flux surface, inferred from the current history.

\[V_C^{(I)} = L_i\,\dot I_p - V_B + 2V_R\]
NameTypeUnitDescription
L_i_Hfloat or np.ndarrayH

Dimensional internal inductance, finite and non-negative.

dI_p_dt_A_sfloat or np.ndarrayA/s

Rate of change of the plasma current, finite.

V_B_Vfloat or np.ndarrayV

Boundary loop voltage, finite.

V_R_Vfloat or np.ndarrayV

Resistive voltage, finite.

Returns
—float or np.ndarrayV

$V_C$.

Convention

Romero’s eq. (40) solved for $V_C$; see equilibrium_surface_voltage_from_I_p_dL_i_V_R for the other route and what their difference measures.

Raises

  • ValueError A non-finite input or a negative internal inductance.
See Also · References

See Also

equilibrium_surface_voltage_from_I_p_dL_i_V_R

References

  1. J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010) 115002, eq. (40).

internal_inductance_from_psi_C_psi_B_I_p

Convention-sensitive source
internal_inductance_from_psi_C_psi_B_I_p(psi_C_Wb, psi_B_Wb, I_p_A)
Show source vaft/formula/transformer.py, lines 386–439
def internal_inductance_from_psi_C_psi_B_I_p(psi_C_Wb, psi_B_Wb, I_p_A):
    r"""Dimensional internal inductance from the equilibrium and boundary fluxes.

    $$L_i = \frac{\psi_C - \psi_B}{I_p}$$

    Parameters
    ----------
    psi_C_Wb : float or np.ndarray
        Current-weighted flux average, Romero's sign, finite [Wb].
    psi_B_Wb : float or np.ndarray
        Boundary flux, same convention, finite [Wb].
    I_p_A : float or np.ndarray
        Plasma current, finite and non-zero [A].

    Returns
    -------
    float or np.ndarray
        Internal inductance [H].

    Raises
    ------
    ValueError
        A non-finite input, a zero current, or a negative result -- which
        means the flux is in a convention opposite to Romero's.

    Convention
    ----------
    **Exact, and a sign check on the flux convention.**  With
    $W_{p,\mathrm{int}} = \tfrac12(\psi_C - \psi_B) I_p$ this is
    $2W_{p,\mathrm{int}}/I_p^2$, the same $L_i$ as
    :func:`vaft.formula.equilibrium.internal_inductance_from_W_int_Ip`, so it
    is positive for any current profile.  A negative value is therefore not a
    physical answer but an inverted $\psi$ -- a COCOS whose flux grows
    outward for positive current -- and is refused rather than returned.  A
    per-radian flux is $2\pi$ too small and passes that check: convert it
    before calling.

    References
    ----------
    .. [1] J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010)
           115002, eqs. (35)-(36).

    See Also
    --------
    current_weighted_flux_from_psi_j_dS
    """
    current = _nonzero("I_p_A", I_p_A)
    inductance = (_finite("psi_C_Wb", psi_C_Wb) - _finite("psi_B_Wb", psi_B_Wb)) / current
    if np.any(inductance < 0.0):
        raise ValueError(
            "psi_C - psi_B has the opposite sign to I_p, so L_i would be negative: "
            "the flux is not in Romero's convention (negate it, or check its COCOS)"
        )
    return _maybe_scalar(inductance, psi_C_Wb, psi_B_Wb, I_p_A)

Dimensional internal inductance from the equilibrium and boundary fluxes.

\[L_i = \frac{\psi_C - \psi_B}{I_p}\]
NameTypeUnitDescription
psi_C_Wbfloat or np.ndarrayWb

Current-weighted flux average, Romero’s sign, finite.

psi_B_Wbfloat or np.ndarrayWb

Boundary flux, same convention, finite.

I_p_Afloat or np.ndarrayA

Plasma current, finite and non-zero.

Returns
—float or np.ndarrayH

Internal inductance.

Convention

Exact, and a sign check on the flux convention. With $W_{p,\mathrm{int}} = \tfrac12(\psi_C - \psi_B) I_p$ this is $2W_{p,\mathrm{int}}/I_p^2$, the same $L_i$ as vaft.formula.equilibrium.internal_inductance_from_W_int_Ip, so it is positive for any current profile. A negative value is therefore not a physical answer but an inverted $\psi$ – a COCOS whose flux grows outward for positive current – and is refused rather than returned. A per-radian flux is $2\pi$ too small and passes that check: convert it before calling.

Raises

  • ValueError A non-finite input, a zero current, or a negative result – which means the flux is in a convention opposite to Romero’s.
See Also · References

See Also

current_weighted_flux_from_psi_j_dS

References

  1. J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010) 115002, eqs. (35)-(36).

internal_inductance_rate_from_I_p_V_R_V_C

Convention-sensitive source
internal_inductance_rate_from_I_p_V_R_V_C(I_p_A, V_R_V, V_C_V)
Show source vaft/formula/transformer.py, lines 126–168
def internal_inductance_rate_from_I_p_V_R_V_C(I_p_A, V_R_V, V_C_V):
    r"""Rate of change of the internal inductance, Romero's exact balance.

    $$\dot L_i = \frac{2\,(V_R - V_C)}{I_p}$$

    Parameters
    ----------
    I_p_A : float or np.ndarray
        Plasma current, finite and non-zero [A].
    V_R_V : float or np.ndarray
        Resistive voltage, finite [V].
    V_C_V : float or np.ndarray
        Voltage at the equilibrium flux surface, finite [V].

    Returns
    -------
    float or np.ndarray
        $\mathrm{d}L_i/\mathrm{d}t$ [H/s].

    Raises
    ------
    ValueError
        A non-finite input or a zero plasma current.

    Convention
    ----------
    Romero's signs, as in the module docstring.  Exact: no current-profile
    model enters.  $L_i$ is steady exactly when $V_C = V_R$, and the full
    steady state is $V_C = V_R = V_B$, a flat loop-voltage profile.

    References
    ----------
    .. [1] J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010)
           115002, eq. (39).

    See Also
    --------
    plasma_current_rate_from_L_i_V_B_V_C_V_R
    equilibrium_surface_voltage_from_I_p_dL_i_V_R
    """
    current = _nonzero("I_p_A", I_p_A)
    rate = 2.0 * (_finite("V_R_V", V_R_V) - _finite("V_C_V", V_C_V)) / current
    return _maybe_scalar(rate, I_p_A, V_R_V, V_C_V)

Rate of change of the internal inductance, Romero’s exact balance.

\[\dot L_i = \frac{2\,(V_R - V_C)}{I_p}\]
NameTypeUnitDescription
I_p_Afloat or np.ndarrayA

Plasma current, finite and non-zero.

V_R_Vfloat or np.ndarrayV

Resistive voltage, finite.

V_C_Vfloat or np.ndarrayV

Voltage at the equilibrium flux surface, finite.

Returns
—float or np.ndarrayH/s

$\mathrm{d}L_i/\mathrm{d}t$.

Convention

Romero’s signs, as in the module docstring. Exact: no current-profile model enters. $L_i$ is steady exactly when $V_C = V_R$, and the full steady state is $V_C = V_R = V_B$, a flat loop-voltage profile.

Raises

  • ValueError A non-finite input or a zero plasma current.
See Also · References

See Also

plasma_current_rate_from_L_i_V_B_V_C_V_R equilibrium_surface_voltage_from_I_p_dL_i_V_R

References

  1. J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010) 115002, eq. (39).

plasma_current_rate_from_L_i_V_B_V_C_V_R

Convention-sensitive source
plasma_current_rate_from_L_i_V_B_V_C_V_R(L_i_H, V_B_V, V_C_V, V_R_V)
Show source vaft/formula/transformer.py, lines 171–220
def plasma_current_rate_from_L_i_V_B_V_C_V_R(L_i_H, V_B_V, V_C_V, V_R_V):
    r"""Rate of change of the plasma current, Romero's exact balance.

    $$\dot I_p = \frac{V_B + V_C - 2V_R}{L_i}$$

    Parameters
    ----------
    L_i_H : float or np.ndarray
        Dimensional internal inductance, finite and positive [H].
    V_B_V : float or np.ndarray
        Boundary loop voltage, finite [V].
    V_C_V : float or np.ndarray
        Voltage at the equilibrium flux surface, finite [V].
    V_R_V : float or np.ndarray
        Resistive voltage, finite [V].

    Returns
    -------
    float or np.ndarray
        $\mathrm{d}I_p/\mathrm{d}t$ [A/s].

    Raises
    ------
    ValueError
        A non-finite input or a non-positive internal inductance.

    Convention
    ----------
    Romero's signs.  Together with
    :func:`internal_inductance_rate_from_I_p_V_R_V_C` it gives
    $L_i\dot I_p + \tfrac12 I_p\dot L_i = V_B - V_R$, the energy balance of
    the internal field, without assuming how $L_i$ evolves.  Only the
    internal inductance appears: the external one and the coils are inside
    $V_B$.

    References
    ----------
    .. [1] J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010)
           115002, eq. (40).

    See Also
    --------
    internal_inductance_rate_from_I_p_V_R_V_C
    equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_R
    """
    inductance = _finite("L_i_H", L_i_H)
    if np.any(inductance <= 0.0):
        raise ValueError(f"L_i_H must be positive; got {L_i_H!r}")
    drive = _finite("V_B_V", V_B_V) + _finite("V_C_V", V_C_V) - 2.0 * _finite("V_R_V", V_R_V)
    return _maybe_scalar(drive / inductance, L_i_H, V_B_V, V_C_V, V_R_V)

Rate of change of the plasma current, Romero’s exact balance.

\[\dot I_p = \frac{V_B + V_C - 2V_R}{L_i}\]
NameTypeUnitDescription
L_i_Hfloat or np.ndarrayH

Dimensional internal inductance, finite and positive.

V_B_Vfloat or np.ndarrayV

Boundary loop voltage, finite.

V_C_Vfloat or np.ndarrayV

Voltage at the equilibrium flux surface, finite.

V_R_Vfloat or np.ndarrayV

Resistive voltage, finite.

Returns
—float or np.ndarrayA/s

$\mathrm{d}I_p/\mathrm{d}t$.

Convention

Romero’s signs. Together with internal_inductance_rate_from_I_p_V_R_V_C it gives $L_i\dot I_p + \tfrac12 I_p\dot L_i = V_B - V_R$, the energy balance of the internal field, without assuming how $L_i$ evolves. Only the internal inductance appears: the external one and the coils are inside $V_B$.

Raises

  • ValueError A non-finite input or a non-positive internal inductance.
See Also · References

See Also

internal_inductance_rate_from_I_p_V_R_V_C equilibrium_surface_voltage_from_L_i_dI_p_V_B_V_R

References

  1. J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010) 115002, eq. (40).

resistive_voltage_from_R_p_I_p_I_ni

Convention-sensitive source
resistive_voltage_from_R_p_I_p_I_ni(R_p_ohm, I_p_A, I_ni_A)
Show source vaft/formula/transformer.py, lines 74–123
def resistive_voltage_from_R_p_I_p_I_ni(R_p_ohm, I_p_A, I_ni_A):
    r"""Resistive voltage of the plasma, net of non-inductive current drive.

    $$V_R = R_p\,(I_p - \hat I)$$

    Parameters
    ----------
    R_p_ohm : float or np.ndarray
        Plasma resistance, finite and non-negative [Ohm].
    I_p_A : float or np.ndarray
        Plasma current, finite [A].
    I_ni_A : float or np.ndarray
        Non-inductively driven current, finite; ``0`` asserts a purely
        Ohmic plasma [A].

    Returns
    -------
    float or np.ndarray
        Resistive voltage [V].

    Raises
    ------
    ValueError
        A non-finite input or a negative resistance.

    Convention
    ----------
    **``I_ni_A`` has no default on purpose.**  $\hat I = 0$ is a statement
    that nothing but the transformer drives current, true of a pure-Ohmic
    VEST discharge and false with EC, NBI or helicity injection; a caller
    must make it.  $R_p$ and $\hat I$ are Romero's resistance-weighted
    definitions, $\int\eta j^2 dS/I_p^2$ and $\int\eta j\hat j dS/\int\eta j^2
    dS\cdot I_p$, which are what make $I_p V_R$ the dissipated power; a
    Spitzer ring resistance is an estimate of the first.

    References
    ----------
    .. [1] J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010)
           115002, eqs. (17)-(21).

    See Also
    --------
    vaft.formula.startup.plasma_resistance_uniform_ellipse_from_eta_R0_a_kappa
    """
    resistance = _finite("R_p_ohm", R_p_ohm)
    if np.any(resistance < 0.0):
        raise ValueError(f"R_p_ohm must be non-negative; got {R_p_ohm!r}")
    current = _finite("I_p_A", I_p_A)
    driven = _finite("I_ni_A", I_ni_A)
    return _maybe_scalar(resistance * (current - driven), R_p_ohm, I_p_A, I_ni_A)

Resistive voltage of the plasma, net of non-inductive current drive.

\[V_R = R_p\,(I_p - \hat I)\]
NameTypeUnitDescription
R_p_ohmfloat or np.ndarrayOhm

Plasma resistance, finite and non-negative.

I_p_Afloat or np.ndarrayA

Plasma current, finite.

I_ni_Afloat or np.ndarrayA

Non-inductively driven current, finite; 0 asserts a purely Ohmic plasma.

Returns
—float or np.ndarrayV

Resistive voltage.

Convention

I_ni_A has no default on purpose. $\hat I = 0$ is a statement that nothing but the transformer drives current, true of a pure-Ohmic VEST discharge and false with EC, NBI or helicity injection; a caller must make it. $R_p$ and $\hat I$ are Romero’s resistance-weighted definitions, $\int\eta j^2 dS/I_p^2$ and $\int\eta j\hat j dS/\int\eta j^2 dS\cdot I_p$, which are what make $I_p V_R$ the dissipated power; a Spitzer ring resistance is an estimate of the first.

Raises

  • ValueError A non-finite input or a negative resistance.
See Also · References

See Also

vaft.formula.startup.plasma_resistance_uniform_ellipse_from_eta_R0_a_kappa

References

  1. J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010) 115002, eqs. (17)-(21).

romero_closure_rates_from_I_p_L_i_V_CB_V_B_V_R_k_tau

Empirical fitConvention-sensitive source
romero_closure_rates_from_I_p_L_i_V_CB_V_B_V_R_k_tau(I_p_A, L_i_H, V_CB_V, V_B_V, V_R_V, k, tau_s)

State rates of Romero’s first-order current-diffusion closure.

\[L_i\,\dot I_p = 2(V_B - V_R) + V,\qquad I_p\,\dot L_i = 2(V_R - V_B) - 2V,\qquad \dot V \simeq -\frac{V}{\tau} + \frac{k}{\tau}(V_R - V_B)\]

with $V = V_C - V_B$: the two exact identities of plasma_current_rate_from_L_i_V_B_V_C_V_R and internal_inductance_rate_from_I_p_V_R_V_C rewritten in $V$, and a first-order relaxation of $V$ that closes them.

NameTypeUnitDescription
I_p_Afloat or np.ndarrayA

Plasma current, finite and non-zero.

L_i_Hfloat or np.ndarrayH

Dimensional internal inductance, finite and positive.

V_CB_Vfloat or np.ndarrayV

$V = V_C - V_B$, the equilibrium-surface voltage relative to the boundary, finite.

V_B_Vfloat or np.ndarrayV

Boundary loop voltage, finite.

V_R_Vfloat or np.ndarrayV

Resistive voltage, finite.

kfloat or np.ndarray-

Closure gain, finite.

tau_sfloat or np.ndarrays

Closure time constant, finite and positive.

Returns
dI_p_dtfloat or np.ndarrayA/s

Rate of change of the plasma current.

dL_i_dtfloat or np.ndarrayH/s

Rate of change of the internal inductance.

dV_CB_dtfloat or np.ndarrayV/s

Rate of change of $V_C - V_B$.

Convention

Romero’s signs, as in the module docstring. The first two rates are exact; only $\dot V$ is modelled. The fixed point is $V = 0$ and $V_R = V_B$ – a flat loop-voltage profile – for any $k \ne 1$ and $\tau$: there $L_i$ and $I_p$ are both steady.

Raises

  • ValueError A non-finite input, a zero current, a non-positive internal inductance or a non-positive time constant.
Validity · Limitations · See Also · References

Validity

Empirical fit. Eq. (41) is a first-order approximation of current diffusion, and $k$ and $\tau$ are identified per device and regime by fitting the model to measured histories (Romero’s JET fits); nothing here supplies them. With $k = 0$ the relative voltage simply decays as $e^{-t/\tau}$.

Limitations

One radial mode: a current profile that relaxes on two time scales, or a sawtoothing core, is outside it. $V_R$ is an input, so an $R_p$ that depends on the evolving profile must be updated by the caller.

See Also

plasma_current_rate_from_L_i_V_B_V_C_V_R internal_inductance_rate_from_I_p_V_R_V_C

References

  1. J. A. Romero and JET-EFDA contributors, Nucl. Fusion 50 (2010) 115002, eqs. (41)-(45).

results matching ""

    No results matching ""