Queue¶
Queue class and helper objects for defining one.
dexter.InitialFluxArray(kind: FluxCoordinate, values: Array1)
¶
A 1D array of initial "Toroidal" or "Poloidal" fluxes.
Useful when creating a QueueInitialConditions.
Example
Methods:
-
__mul__–Multiplies inner values by
scalar.
Attributes:
-
kind(FluxCoordinate) –The kind of the contained fluxes ("Toroidal" or "Poloidal").
-
values(Array1) –The flux values.
dexter.QueueInitialConditions()
¶
Sets of initial conditions for initializing a Queue.
Use QueueInitialConditions.boozer
and QueueInitialConditions.mixed class
methods to construct the set.
Use the InitialFluxArray helper object to initialize
the \(\psi\)/\(\psi_p\) variables.
Methods:
-
boozer–Creates initial conditions for a Queue in Boozer coordinates.
-
mixed–Creates initial conditions for a Queue in Mixed coordinates.
Attributes:
-
t_array(Array1) –The initial times array.
-
theta_array(Array1) –The initial \(\theta\) array.
-
zeta_array(Array1) –The initial \(\zeta\) array.
-
mu_array(Array1) –The initial \(\mu\) array.
-
rho_array(Array1) –The initial \(\rho\) array.
-
pzeta_array(Array1) –The initial \(P_\zeta\) array.
dexter.QueueInitialConditions.t_array: Array1
property
¶
The initial times array.
dexter.QueueInitialConditions.theta_array: Array1
property
¶
The initial \(\theta\) array.
dexter.QueueInitialConditions.zeta_array: Array1
property
¶
The initial \(\zeta\) array.
dexter.QueueInitialConditions.mu_array: Array1
property
¶
The initial \(\mu\) array.
dexter.QueueInitialConditions.rho_array: Array1
property
¶
The initial \(\rho\) array.
dexter.QueueInitialConditions.pzeta_array: Array1
property
¶
The initial \(P_\zeta\) array.
dexter.QueueInitialConditions.boozer(t0: Array1, flux0: InitialFluxArray, theta0: Array1, zeta0: Array1, rho0: Array1, mu0: Array1) -> QueueInitialConditions
classmethod
¶
Creates initial conditions for a Queue in Boozer coordinates.
The initial conditions are defined on the
\((t, \psi, \theta, \zeta, \rho, \mu)\) or
\((t, \psi_p, \theta, \zeta, \rho, \mu)\)
space, depending on the value of flux0.
Parameters:
-
t0(Array1) –The initial times, in Normalized Units.
-
flux0(InitialFluxArray) –The initial \(\psi / \psi_p\), in Normalized Units.
-
theta0(Array1) –The initial \(\theta\) angles, in rads.
-
zeta0(Array1) –The initial \(\zeta\) angles, in rads.
-
rho0(Array1) –The initial \(\rho_{||}\), in Normalized Units.
-
mu0(Array1) –The initial magnetic moments \(\mu\), in Normalized Units.
Example
>>> num = 10
>>> psi0s = InitialFluxArray("Toroidal", np.linspace(0, 0.5, num))
>>>
>>> initial_conditions = QueueInitialConditions.boozer(
... t0=np.zeros(num),
... flux0=psi0s,
... theta0=np.zeros(num),
... zeta0=np.zeros(num),
... rho0=np.logspace(1e-6, 1e-5, num),
... mu0=np.full(num, 1e-6),
... )
dexter.QueueInitialConditions.mixed(t0: Array1, flux0: InitialFluxArray, theta0: Array1, zeta0: Array1, pzeta0: Array1, mu0: Array1) -> QueueInitialConditions
classmethod
¶
Creates initial conditions for a Queue in Mixed coordinates.
The initial conditions are defined on the
\((t, \psi, \theta, \zeta, P_\zeta, \mu)\) or
\((t, \psi_p, \theta, \zeta, P_\zeta, \mu)\)
space, depending on the value of flux0.
Parameters:
-
t0(Array1) –The initial times, in Normalized Units.
-
flux0(InitialFluxArray) –The initial \(\psi / \psi_p\), in Normalized Units.
-
theta0(Array1) –The initial \(\theta\) angles, in rads.
-
zeta0(Array1) –The initial \(\zeta\) angles, in rads.
-
pzeta0(Array1) –The initial \(P_\zeta\), in Normalized Units.
-
mu0(Array1) –The initial magnetic moments \(\mu\), in Normalized Units.
Example
>>> num = 10
>>> psi0s = InitialFluxArray("Toroidal", np.linspace(0, 0.5, num))
>>>
>>> initial_conditions = QueueInitialConditions.mixed(
... t0=np.zeros(num),
... flux0=psi0s,
... theta0=np.zeros(num),
... zeta0=np.zeros(num),
... pzeta0=np.linspace(-0.02, -0.01, num),
... mu0=np.full(num, 1e-6),
... )
dexter.Queue(initial_conditions: QueueInitialConditions)
¶
A collection of multiple Particles , constructed from a
QueueInitialConditions.
Offers the ability to batch Particle::integrate or
Particle::intersect all the contained particles,
using multiple threads.
Parameters:
-
initial_conditions(QueueInitialConditions) –The initial conditions sets.
Example
>>> # Initial Conditions setup
>>> num = 10
>>> psi0s = InitialFluxArray("Toroidal", np.linspace(0, 0.5, num))
>>>
>>> initial_conditions = QueueInitialConditions.boozer(
... t0=np.zeros(num),
... flux0=psi0s,
... theta0=np.zeros(num),
... zeta0=np.zeros(num),
... rho0=np.logspace(1e-6, 1e-5, num),
... mu0=np.full(num, 1e-6),
... )
>>>
>>> # Queue setup
>>> queue = dex.Queue(initial_conditions)
Methods:
-
plot_energies–Plots a stem plot of all the particles' energies.
-
plot_steps_taken–Plots a stem plot of all the number of steps each particle has taken.
-
plot_steps_stored–Plots a stem plot of all the number of steps each particle has stored.
-
plot_const_zeta_cartesian_poincare–Plots the \(\zeta=const\) poincare map on the \(\theta-\psi\) cartesian plane.
-
plot_const_theta_cartesian_poincare–Plots the \(\theta=const\) poincare map on the \(\zeta-\psi_p\) cartesian plane.
-
plot_const_zeta_rz_poincare–Plots the \(\zeta=const\) poincare map on the \(R-Z\) coordinate system.
-
plot_qkinetic_radial_sweep–Plots the contained particles' calculated \(q_{kinetic}\) with respect to their \(\psi_0/\psi_{p,0}\).
-
plot_qkinetic_pzeta_sweep–Plots the contained particles' calculated \(q_{kinetic}\) with respect to their \(P_\zeta\).
-
plot_qkinetic_energy_sweep–Plots the contained particles' calculated \(q_{kinetic}\) with respect to their Energy.
-
plot_qkinetic_pzeta_energy3d–Plots the contained particles' calculated \(q_{kinetic}\) with respect to their \(P_\zeta\) and \(E\).
-
from_particles–Creates a new Queue from a list of Particles, copying all their attributes.
-
retain_pzeta–Iterates through self’s particles, keeping only the ones with an initial \(P_\zeta\)
-
retain_energy–Iterates through self’s particles, keeping only the ones with an initial Energy
-
bin_pzeta–Iterates through self’s particles, keeping only one particle in each Pζ bin.
-
retain_energy_pzeta_positions–Iterates through self’s particles, keeping only the ones with an
-
retain_orbit_types–Iterates through self’s particles, keeping only the ones with an
-
integrate–Integrates all the contained particles for a specific time interval.
-
intersect–Integrates all the contained particles, calculating their intersections with a constant \(\theta\) or \(\zeta\) surface.
-
close–Integrates all the contained particles for a certain amount of \(\theta-\psi\) periods.
-
classify–Classifies the particles' orbits using their position on the \((E, P_\zeta, \mu=const)\)
Attributes:
-
initial_conditions(QueueInitialConditions) –The Queue's initial conditions.
-
particle_count(int) –The number of contained Particles.
-
particles(list[Particle]) –The contained Particles.
-
routine(Routine) –The routine run by the Queue.
-
energy_array(Array1) –The particles' calculated energies.
-
steps_taken_array(Array1) –The number of steps each particle has taken.
-
steps_stored_array(Array1) –The number of steps each particle has stored.
-
omega_theta_array(Array1) –The particles' calculated \(\omega_theta\).
-
omega_zeta_array(Array1) –The particles' calculated \(\omega_zeta\).
-
qkinetic_array(Array1) –The particles' calculated \(q_{kinetic}\).
-
durations(np.ndarray[tuple[int], np.dtype[np.timedelta64]]) –The particles' calculated \(q_{kinetic}\).
dexter.Queue.initial_conditions: QueueInitialConditions
property
¶
The Queue's initial conditions.
dexter.Queue.particle_count: int
property
¶
The number of contained Particles.
dexter.Queue.particles: list[Particle]
property
¶
The contained Particles.
dexter.Queue.routine: Routine
property
¶
The routine run by the Queue.
dexter.Queue.energy_array: Array1
property
¶
The particles' calculated energies.
Particles are visited in order of instantiation.
dexter.Queue.steps_taken_array: Array1
property
¶
The number of steps each particle has taken.
Particles are visited in order of instantiation.
dexter.Queue.steps_stored_array: Array1
property
¶
The number of steps each particle has stored.
Particles are visited in order of instantiation.
dexter.Queue.omega_theta_array: Array1
property
¶
The particles' calculated \(\omega_theta\).
Particles are visited in order of instantiation.
dexter.Queue.omega_zeta_array: Array1
property
¶
The particles' calculated \(\omega_zeta\).
Particles are visited in order of instantiation.
dexter.Queue.qkinetic_array: Array1
property
¶
The particles' calculated \(q_{kinetic}\).
Particles are visited in order of instantiation.
dexter.Queue.durations: np.ndarray[tuple[int], np.dtype[np.timedelta64]]
property
¶
The particles' calculated \(q_{kinetic}\).
Particles are visited in order of instantiation.
dexter.Queue.plot_energies(show=True) -> Canvas
¶
Plots a stem plot of all the particles' energies.
Particles are visited in order of instantiation.
Useful to visualize the energy spans of the particles under study.
Parameters:
-
show–Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.plot_steps_taken(show=True) -> Canvas
¶
Plots a stem plot of all the number of steps each particle has taken.
Particles are visited in order of instantiation.
Parameters:
-
show–Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.plot_steps_stored(show=True) -> Canvas
¶
Plots a stem plot of all the number of steps each particle has stored.
Particles are visited in order of instantiation.
Parameters:
-
show–Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.plot_const_zeta_cartesian_poincare(initial: bool = False, color: bool = False, show: bool = True) -> Canvas
¶
Plots the \(\zeta=const\) poincare map on the \(\theta-\psi\) cartesian plane.
Parameters:
-
color(bool, default:False) –Whether or not to use a different color for each orbit. Defaults to False.
-
initial(bool, default:False) –Whether or not to plot the initial points. Note that the initial \(\theta_0\) should be equal to the intersection angle, and the initial flux coordinate should be \(\psi\). Defaults to False.
-
show(bool, default:True) –Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.plot_const_theta_cartesian_poincare(initial: bool = False, color: bool = False, show: bool = True) -> Canvas
¶
Plots the \(\theta=const\) poincare map on the \(\zeta-\psi_p\) cartesian plane.
Parameters:
-
color(bool, default:False) –Whether or not to use a different color for each orbit. Defaults to False.
-
initial(bool, default:False) –Whether or not to plot the initial points. Note that the initial \(\zeta_0\) should be equal to the intersection angle, and the initial flux coordinate should be \(\psi_p\). Defaults to False.
-
show(bool, default:True) –Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.plot_const_zeta_rz_poincare(equilibrium: Equilibrium, initial: bool = False, color: bool = False, show: bool = True) -> Canvas
¶
Plots the \(\zeta=const\) poincare map on the \(R-Z\) coordinate system.
Parameters:
-
color(bool, default:False) –Whether or not to use a different color for each orbit. Defaults to False.
-
initial(bool, default:False) –Whether or not to plot the initial points. Note that the initial \(\theta_0\) should be equal to the intersection angle, and the initial flux coordinate should be \(\psi\). Defaults to False.
-
show(bool, default:True) –Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.plot_qkinetic_radial_sweep(lcfs_value: float | None = None, show: bool = True) -> Canvas
¶
Plots the contained particles' calculated \(q_{kinetic}\) with respect to their \(\psi_0/\psi_{p,0}\).
This is useful for low energy particles and magnetic field lines, where $\Delta\psi \approx \(\Delta\psi_p \approx 0\).
Parameters:
-
lcfs_value(float | None, default:None) –The value of the magnetic flux \(/psi/\psi_p\) at the Last Closed Flux Surface. If passed, the magnetic flux values are displayed with respect to it.
-
show(bool, default:True) –Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.plot_qkinetic_pzeta_sweep(psip_last: float | None = None, show: bool = True) -> Canvas
¶
Plots the contained particles' calculated \(q_{kinetic}\) with respect to their \(P_\zeta\).
Parameters:
-
psip_last(float | None, default:None) –The value of the poloidal flux \(\psi_p\) at the Last Closed Flux Surface. If passed, the \(P_\zeta\) values are displayed with respect to \(\psi_{p,last}\)
-
show(bool, default:True) –Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.plot_qkinetic_energy_sweep(show: bool = True) -> Canvas
¶
Plots the contained particles' calculated \(q_{kinetic}\) with respect to their Energy.
Parameters:
-
show(bool, default:True) –Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.plot_qkinetic_pzeta_energy3d(psip_last: float | None = None, show: bool = True) -> Canvas3d
¶
Plots the contained particles' calculated \(q_{kinetic}\) with respect to their \(P_\zeta\) and \(E\).
Parameters:
-
psip_last(float | None, default:None) –The value of the poloidal flux \(\psi_p\) at the Last Closed Flux Surface. If passed, the \(P_\zeta\) values are displayed with respect to \(\psi_{p,last}\)
-
show(bool, default:True) –Whether or not to call
plt.show(). Defaults to True.
Returns:
-
Canvas–The produced
FigureandAx.
dexter.Queue.from_particles(particles: list[Particle]) -> Queue
classmethod
¶
Creates a new Queue from a list of Particles, copying all their attributes.
dexter.Queue.retain_pzeta(span: tuple[float, float]) -> None
¶
Iterates through self’s particles, keeping only the ones with an initial \(P_\zeta\) within the given span, discarding the rest.
dexter.Queue.retain_energy(span: tuple[float, float]) -> None
¶
Iterates through self’s particles, keeping only the ones with an initial Energy within the given span, discarding the rest.
dexter.Queue.bin_pzeta(num_bins: int) -> None
¶
Iterates through self’s particles, keeping only one particle in each Pζ bin.
Bins are defined as the intervals: $$ P_{\zeta, min} <= P_{\zeta, min} + \Delta P_\zeta <= P_{\zeta, min} + 2\Delta P_\zeta <= ... <= P_{\zeta, min} + (n-1)\Delta P_\zeta <= P_{\zeta, max}, $$ where \(n\)=1..num_bins and \(\Delta P_\zeta = (P_{\zeta,max} - P_{\zeta,min})/n\).
When called after retain_energy with a small energy span,
we can obtain a set of particles of approximately same energy and approximately equispaced
\(P_\zeta\)s, depending on the span and num_bins parameters. This is useful since we
essentially have no control over the particles’ energies.
Note
Particles are visited in order of instantiation, and the first particle that falls in an unfilled bin will be selected.
dexter.Queue.retain_energy_pzeta_positions(positions: Iterable[EnergyPzetaPosition]) -> None
¶
Iterates through self’s particles, keeping only the ones with an
EnergyPzetaPosition that matches an element of
positions.
dexter.Queue.retain_orbit_types(orbit_types: Iterable[OrbitType]) -> None
¶
Iterates through self’s particles, keeping only the ones with an
OrbitType that matches an element of orbit_types.
dexter.Queue.integrate(equilibrium: Equilibrium, teval: tuple[float, float], *, stepping_method: Optional[SteppingMethod] = 'EnergyAdaptiveStep', max_steps: Optional[int] = 1000000, first_step: Optional[float] = 0.1, safety_factor: Optional[float] = 0.9, energy_rel_tol: Optional[float] = 1e-12, energy_abs_tol: Optional[float] = 1e-14, error_rel_tol: Optional[float] = 1e-12, error_abs_tol: Optional[float] = 1e-14)
¶
Integrates all the contained particles for a specific time interval.
The time interval is in Normalized Units (inverse gyro-frequency).
Parameters:
-
equilibrium(Equilibrium) –The equilibrium in which to integrate the particle.
-
teval(tuple[float, float]) –The time span \((t_0, t_f)\) in which to integrate the particles, in Normalized Units.
Other Parameters:
-
stepping_method(Optional[SteppingMethod]) –The optimal step calculation method. Defaults to "EnergyAdaptiveStep".
-
max_steps(Optional[int]) –The maximum amount of steps a particle can make before terminating its integration. Defaults to 1.000.000.
-
first_step(Optional[float]) –The initial time step for the RKF45 adaptive step method. The value is empirical. Defaults to 1e-1.
-
safety_factor(Optional[float]) –The safety factor of the solver. Should be less than 1.0. Defaults to 0.9.
-
energy_rel_tol(Optional[float]) –The relative tolerance of the energy difference in every step. Defaults to 1e-12.
-
energy_abs_tol(Optional[float]) –The absolute tolerance of the energy difference in every step. Defaults to 1e-14.
-
error_rel_tol(Optional[float]) –The relative tolerance of the local truncation error in every step. Defaults to 1e-12.
-
error_abs_tol(Optional[float]) –The absolute tolerance of the local truncation error in every step. Defaults to 1e-14.
Example
>>> # Equilibrium setup
>>> LCFS = dex.LastClosedFluxSurface(kind="Toroidal", value=0.45)
>>> equilibrium = dex.Equilibrium(
... qfactor=dex.ParabolicQfactor(qaxis=1.1, qlast=4.1, lcfs=LCFS),
... current=dex.LarCurrent(),
... bfield=dex.LarBfield(),
... perturbation=dex.Perturbation(
... [
... dex.CosHarmonic(epsilon=1e-3, lcfs=LCFS, m=1, n=3, phase=0),
... dex.CosHarmonic(epsilon=1e-3, lcfs=LCFS, m=2, n=3, phase=0),
... ]
... )
... )
>>>
>>> # Initial Conditions setup
>>> num = 10
>>> psi0s = InitialFluxArray("Toroidal", np.linspace(0, 0.5, num))
>>>
>>> initial_conditions = QueueInitialConditions.boozer(
... t0=np.zeros(num),
... flux0=psi0s,
... theta0=np.zeros(num),
... zeta0=np.zeros(num),
... rho0=np.logspace(1e-6, 1e-5, num),
... mu0=np.full(num, 1e-6),
... )
>>>
>>> # Queue setup
>>> queue = dex.Queue(initial_conditions)
>>>
>>> # Run
>>> queue.integrate(
... equilibrium= equilibrium,
... teval=(0, 1e2),
... first_step=1e-3,
... energy_rel_tol=1e-11,
... )
dexter.Queue.intersect(equilibrium: Equilibrium, intersect_params: IntersectParams, *, stepping_method: Optional[SteppingMethod] = 'EnergyAdaptiveStep', max_steps: Optional[int] = 1000000, first_step: Optional[float] = 0.1, safety_factor: Optional[float] = 0.9, energy_rel_tol: Optional[float] = 1e-12, energy_abs_tol: Optional[float] = 1e-14, error_rel_tol: Optional[float] = 1e-12, error_abs_tol: Optional[float] = 1e-14)
¶
Integrates all the contained particles, calculating their intersections with a constant \(\theta\) or \(\zeta\) surface.
Otherwise known as a Poincare map.
The intersection surface, angle, and number of turns are configured with the helper class
IntersectParams.
Parameters:
-
equilibrium(Equilibrium) –The equilibrium in which to integrate the particle.
-
intersect_params(IntersectParams) –The parameters of the integration.
Other Parameters:
-
stepping_method(Optional[SteppingMethod]) –The optimal step calculation method. Defaults to "EnergyAdaptiveStep".
-
max_steps(Optional[int]) –The maximum amount of steps a particle can make before terminating its integration. Defaults to 1.000.000.
-
first_step(Optional[float]) –The initial time step for the RKF45 adaptive step method. The value is empirical. Defaults to 1e-1.
-
safety_factor(Optional[float]) –The safety factor of the solver. Should be less than 1.0. Defaults to 0.9.
-
energy_rel_tol(Optional[float]) –The relative tolerance of the energy difference in every step. Defaults to 1e-12.
-
energy_abs_tol(Optional[float]) –The absolute tolerance of the energy difference in every step. Defaults to 1e-14.
-
error_rel_tol(Optional[float]) –The relative tolerance of the local truncation error in every step. Defaults to 1e-12.
-
error_abs_tol(Optional[float]) –The absolute tolerance of the local truncation error in every step. Defaults to 1e-14.
Example
>>> # Equilibrium setup
>>> LCFS = dex.LastClosedFluxSurface(kind="Toroidal", value=0.45)
>>> equilibrium = dex.Equilibrium(
... qfactor=dex.ParabolicQfactor(qaxis=1.1, qlast=4.1, lcfs=LCFS),
... current=dex.LarCurrent(),
... bfield=dex.LarBfield(),
... perturbation=dex.Perturbation(
... [
... dex.CosHarmonic(epsilon=1e-3, lcfs=LCFS, m=1, n=3, phase=0),
... dex.CosHarmonic(epsilon=1e-3, lcfs=LCFS, m=2, n=3, phase=0),
... ]
... )
... )
>>>
>>> # Initial Conditions setup
>>> num = 10
>>> psi0s = InitialFluxArray("Toroidal", np.linspace(0.01, 0.4, num))
>>>
>>> initial_conditions = QueueInitialConditions.mixed(
... t0=np.zeros(num),
... flux0=psi0s,
... theta0=np.zeros(num),
... zeta0=np.zeros(num),
... pzeta0=np.logspace(-0.02, 0.01, num),
... mu0=np.full(num, 7e-7),
... )
>>>
>>> # IntersectParams setup
>>> intersect_params = dex.IntersectParams(
... intersection = "ConstZeta",
... angle = 0.0,
... turns = 5,
... )
>>>
>>> # Queue setup
>>> queue = dex.Queue(initial_conditions)
>>>
>>> # Run
>>> queue.intersect(
... equilibrium=equilibrium,
... intersect_params=intersect_params,
... energy_rel_tol=1e-11,
... )
dexter.Queue.close(equilibrium: Equilibrium, *, periods: Optional[int] = 1, stepping_method: Optional[SteppingMethod] = 'EnergyAdaptiveStep', max_steps: Optional[int] = 1000000, first_step: Optional[float] = 0.1, safety_factor: Optional[float] = 0.9, energy_rel_tol: Optional[float] = 1e-12, energy_abs_tol: Optional[float] = 1e-14, error_rel_tol: Optional[float] = 1e-12, error_abs_tol: Optional[float] = 1e-14)
¶
Integrates all the contained particles for a certain amount of \(\theta-\psi\) periods.
Parameters:
-
equilibrium(Equilibrium) –The equilibrium in which to integrate the particle.
-
periods(Optional[int], default:1) –The amount of periods to integrate. Defaults to 1.
Other Parameters:
-
stepping_method(Optional[SteppingMethod]) –The optimal step calculation method. Defaults to "EnergyAdaptiveStep".
-
max_steps(Optional[int]) –The maximum amount of steps a particle can make before terminating its integration. Defaults to 1.000.000.
-
first_step(Optional[float]) –The initial time step for the RKF45 adaptive step method. The value is empirical. Defaults to 1e-1.
-
safety_factor(Optional[float]) –The safety factor of the solver. Should be less than 1.0. Defaults to 0.9.
-
energy_rel_tol(Optional[float]) –The relative tolerance of the energy difference in every step. Defaults to 1e-12.
-
energy_abs_tol(Optional[float]) –The absolute tolerance of the energy difference in every step. Defaults to 1e-14.
-
error_rel_tol(Optional[float]) –The relative tolerance of the local truncation error in every step. Defaults to 1e-12.
-
error_abs_tol(Optional[float]) –The absolute tolerance of the local truncation error in every step. Defaults to 1e-14.
Example
>>> # Equilibrium setup
>>> LCFS = dex.LastClosedFluxSurface(kind="Toroidal", value=0.45)
>>> equilibrium = dex.Equilibrium(
... qfactor=dex.ParabolicQfactor(qaxis=1.1, qlast=4.1, lcfs=LCFS),
... current=dex.LarCurrent(),
... bfield=dex.LarBfield(),
... perturbation=dex.Perturbation([])
... )
>>>
>>> # Initial Conditions setup
>>> num = 10
>>> psi0s = InitialFluxArray("Toroidal", np.linspace(0.01, 0.4, num))
>>>
>>> initial_conditions = QueueInitialConditions.boozer(
... t0=np.zeros(num),
... flux0=psi0s,
... theta0=np.zeros(num),
... zeta0=np.zeros(num),
... rho0=np.full(num, 1e-5),
... mu0=np.full(num, 7e-7),
... )
>>>
>>> # Queue setup
>>> queue = dex.Queue(initial_conditions)
>>>
>>> # Run
>>> queue.close(
... equilibrium=equilibrium,
... periods=1,
... energy_rel_tol=1e-11,
... )
dexter.Queue.classify(equilibrium: Equilibrium)
¶
Classifies the particles' orbits using their position on the \((E, P_\zeta, \mu=const)\) plane without integrating.
Parameters:
-
equilibrium(Equilibrium) –The equilibrium in which to integrate the particles.
Example
>>> # Equilibrium setup
>>> LCFS = dex.LastClosedFluxSurface(kind="Toroidal", value=0.45)
>>> equilibrium = dex.Equilibrium(
... qfactor=dex.ParabolicQfactor(qaxis=1.1, qlast=4.1, lcfs=LCFS),
... current=dex.LarCurrent(),
... bfield=dex.LarBfield(),
... )
>>>
>>> # Initial Conditions setup
>>> num = 10
>>> psi0s = InitialFluxArray("Toroidal", np.linspace(0.01, 0.4, num))
>>>
>>> initial_conditions = QueueInitialConditions.boozer(
... t0=np.zeros(num),
... flux0=psi0s,
... theta0=np.zeros(num),
... zeta0=np.zeros(num),
... rho0=np.full(num, 1e-5),
... mu0=np.full(num, 7e-7),
... )
>>>
>>> # Queue setup
>>> queue = dex.Queue(initial_conditions)
>>>
>>> # Run
>>> queue.classify(equilibrium=equilibrium)