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 absorbingPW, as a :class:PlasmaProfile(and anything else to keep, e.g. a global model’s state);field(profile): the :class:~wellbalanced.spatial.inductive.InductiveField2Dof 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
| Name | Description |
|---|---|
CoupledState | A plasma and its field at one operating point. |
DriverCoupling | A field model and a power-dependent plasma model, solved together. |
PlasmaProfile | A plasma for the field model: electron density, collision frequency, temperature. |
Functions
| Name | Description |
|---|---|
global_model_plasma | The 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
| Name | Type | Description |
|---|---|---|
solution | InductiveSolution | The field, scaled to the coil current of the operating point. |
plasma | Any | What the plasma model returned besides the profile (a
:class:~wellbalanced.driver.DriverState for :func:global_model_plasma). |
rf_power | float | The generator power P + R_net I^2 / 2 [W]. |
absorbed_power | float | The power the plasma absorbs [W]. |
network_resistance | float | R_net [Ohm]. |
depth | float | None | The effective depth of a cut [m]; None in r–z. |
iterations | int | The passes of the fixed point (1 at a set absorbed power). |
converged | bool | Whether the fixed point reached the tolerance. |
history | list[float] | The absorbed power after each pass [W]. |
absorbed_powerattributeinstance attribute#
absorbed_power: floatconvergedattributeclass attributeinstance attribute#
converged: bool = Truedepthattributeinstance attribute#
depth: float | Nonehistoryattributeclass attributeinstance attribute#
history: list[float] = field(default_factory=list)iterationsattributeclass attributeinstance attribute#
iterations: int = 1network_resistanceattributeinstance attribute#
network_resistance: floatplasmaattributeinstance attribute#
plasma: Anyrf_powerattributeinstance attribute#
rf_power: floatsolutionattributeinstance attribute#
solution: InductiveSolutionDriverCouplingclassdataclass#
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
| Name | Type | Description |
|---|---|---|
field | Callable[[PlasmaProfile], InductiveField2D] | profile -> InductiveField2D. |
plasma | Callable[[float], tuple[PlasmaProfile, Any]] | absorbed power [W] -> (PlasmaProfile, anything). |
network_resistance | float | R_net [Ohm]. |
depth | float | None | The effective depth of a cut [m]; None in r–z. |
depthattributeclass attributeinstance attribute#
depth: float | None = Nonefieldattributeinstance attribute#
field: Callable[[PlasmaProfile], InductiveField2D]network_resistanceattributeinstance attribute#
network_resistance: floatplasmaattributeinstance attribute#
plasma: Callable[[float], tuple[PlasmaProfile, Any]]at_absorbed_powermethod#
def at_absorbed_power(power: float) -> CoupledStateThe 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) -> CoupledStateThe 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
collision_frequencyattributeinstance attribute#
collision_frequency: CellFieldelectron_densityattributeinstance attribute#
electron_density: CellFieldelectron_temperatureattributeclass attributeinstance attribute#
electron_temperature: CellField | None = Noneglobal_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.