Skip to content
Projects

wellbalanced.spatial.coupling

The coil current and the plasma together: a power-dependent plasma in the RF field.

For a prescribed plasma the field is linear in the coil current, so the absorbed power fixes the current (:meth:~wellbalanced.spatial.inductive.InductiveSolution.for_power). A real plasma depends on the power it absorbs; :class:DriverCoupling closes the loop between a field model and a plasma model, each a callable:

  • plasma(P): the plasma absorbing P W, as a :class:PlasmaProfile (and anything else to keep, e.g. a global model’s state);
  • field(profile): the :class:~wellbalanced.spatial.inductive.InductiveField2D of that plasma.

:meth:DriverCoupling.at_absorbed_power sets the power the plasma absorbs (one pass, the coil current follows). :meth:DriverCoupling.at_rf_power sets the generator power, as Zielke et al. (PSST 31, 035019, 2022) do with their integral controller: the plasma absorbs P = eta P_RF with eta = R_p / (R_p + R_net), and R_p depends on the plasma, so P is the fixed point of P -> eta(P) P_RF, iterated (with relaxation) to a relative tolerance.

:func:global_model_plasma makes the plasma model of an :class:~wellbalanced.driver.RFDriver’s global model: its electron density, temperature and momentum-transfer frequency on a fixed spatial shape. With it the 0D plasma sits in the real 2D (or r–z) field instead of the transformer model, which the returned :class:~wellbalanced.driver.DriverState still gives for comparison. A fluid model (Fluid2D) will replace the fixed shape.

Classes

NameDescription
CoupledStateA plasma and its field at one operating point.
DriverCouplingA field model and a power-dependent plasma model, solved together.
PlasmaProfileA plasma for the field model: electron density, collision frequency, temperature.

Functions

NameDescription
global_model_plasmaThe plasma model of driver's global model, on a fixed spatial shape.

CoupledStateclassdataclass#

class CoupledState(solution: InductiveSolution, plasma: Any, rf_power: float, absorbed_power: float, network_resistance: float, depth: float | None, iterations: int = 1, converged: bool = True, history: list[float] = list())

A plasma and its field at one operating point.

Attributes

NameTypeDescription
solutionInductiveSolutionThe field, scaled to the coil current of the operating point.
plasmaAnyWhat the plasma model returned besides the profile (a :class:~wellbalanced.driver.DriverState for :func:global_model_plasma).
rf_powerfloatThe generator power P + R_net I^2 / 2 [W].
absorbed_powerfloatThe power the plasma absorbs [W].
network_resistancefloatR_net [Ohm].
depthfloat | NoneThe effective depth of a cut [m]; None in r–z.
iterationsintThe passes of the fixed point (1 at a set absorbed power).
convergedboolWhether the fixed point reached the tolerance.
historylist[float]The absorbed power after each pass [W].

absorbed_powerattributeinstance attribute#

absorbed_power: float

convergedattributeclass attributeinstance attribute#

converged: bool = True

depthattributeinstance attribute#

depth: float | None

historyattributeclass attributeinstance attribute#

history: list[float] = field(default_factory=list)

iterationsattributeclass attributeinstance attribute#

iterations: int = 1

network_resistanceattributeinstance attribute#

network_resistance: float

plasmaattributeinstance attribute#

plasma: Any

rf_powerattributeinstance attribute#

rf_power: float

solutionattributeinstance attribute#

solution: InductiveSolution

coil_currentproperty#

coil_current: float

The coil current amplitude [A].

efficiencyproperty#

efficiency: float

The RF power transfer efficiency P / P_RF.

plasma_resistanceproperty#

plasma_resistance: float

R_p [Ohm].

DriverCouplingclassdataclass#

class DriverCoupling(field: Callable[[PlasmaProfile], InductiveField2D], plasma: Callable[[float], tuple[PlasmaProfile, Any]], network_resistance: float, depth: float | None = None)

A field model and a power-dependent plasma model, solved together.

Attributes

NameTypeDescription
fieldCallable[[PlasmaProfile], InductiveField2D]profile -> InductiveField2D.
plasmaCallable[[float], tuple[PlasmaProfile, Any]]absorbed power [W] -> (PlasmaProfile, anything).
network_resistancefloatR_net [Ohm].
depthfloat | NoneThe effective depth of a cut [m]; None in r–z.

depthattributeclass attributeinstance attribute#

depth: float | None = None

fieldattributeinstance attribute#

field: Callable[[PlasmaProfile], InductiveField2D]

network_resistanceattributeinstance attribute#

network_resistance: float

plasmaattributeinstance attribute#

plasma: Callable[[float], tuple[PlasmaProfile, Any]]

at_absorbed_powermethod#

def at_absorbed_power(power: float) -> CoupledState

The operating point where the plasma absorbs power W.

at_rf_powermethod#

def at_rf_power(rf_power: float, *, guess: float | None = None, tolerance: float = 1e-06, max_iterations: int = 50, relaxation: float = 1.0) -> CoupledState

The operating point at the generator power rf_power W.

Iterates P <- P + relaxation (eta(P) P_RF - P) from guess (half the generator power by default) until |eta P_RF - P| < tolerance P_RF.

PlasmaProfileclassdataclass#

class PlasmaProfile(electron_density: CellField, collision_frequency: CellField, electron_temperature: CellField | None = None)

A plasma for the field model: electron density, collision frequency, temperature.

Attributes

NameTypeDescription
electron_densityCellFieldn_e [m^-3].
collision_frequencyCellFieldnu [1/s].
electron_temperatureCellField | NoneT_e [eV], for viscous electrons; None: cold.

collision_frequencyattributeinstance attribute#

collision_frequency: CellField

electron_densityattributeinstance attribute#

electron_density: CellField

electron_temperatureattributeclass attributeinstance attribute#

electron_temperature: CellField | None = None

settingsmethod#

def settings() -> dict[str, Any]

The keyword arguments of :class:InductiveField2D this plasma sets.

global_model_plasmafunction#

def global_model_plasma(driver: RFDriver, shape: CellField = 1.0, *, viscous: bool = False, guess: GlobalState | Mapping[str, float] | None = None) -> Callable[[float], tuple[PlasmaProfile, DriverState]]

The plasma model of driver’s global model, on a fixed spatial shape.

n_e = shape * <n_e> with the global model’s <n_e> (scale shape to a volume average of 1 over the plasma), and its T_e (if viscous) and momentum-transfer frequency uniform; shape is zero outside the plasma or the field model’s plasma region does it. Each call continues from the last state. Returns (profile, DriverState): the driver state is the transformer model’s view of the same plasma.