scotty.beam_me_up module#
Notes
K**2 = K_R**2 + K_z**2 + (K_zeta/r_R)**2, and K_zeta is constant (mode number). See 14 Sep 2018 notes.
Start in vacuum, otherwise Psi_3D_beam_initial_cartersian does not get done properly
Launching from plasma is possible, but beam needs to be initialised differently
Coordinates#
X, Y, Z- Lab Cartesian coordinatesR, zeta, Z- Lab cylindrical coordinatesx, y, g- Beam coordinatesu1, u2, u_parallel- Field-aligned coordinates
Abbreviations#
bs- backscatteredloc- localisationcum_loc- cumulative_localisationne- equilibrium electron densitydt- datatree (stores data)
Angles#
theta- angle between g and u1, small when mismatch is smalltheta_m- mismatch angle, angle between u1 and K
Units#
SI units
Distance in m
Angles in rad
Temperature in KeV
electron cyclotron frequency positive
K normalised such that K = 1 in vacuum. (Not implemented yet)
Distance not normalised yet, should give it thought
- scotty.beam_me_up.beam_me_up(poloidal_launch_angle_Torbeam, toroidal_launch_angle_Torbeam, launch_freq_GHz, mode_flag, launch_beam_width, launch_beam_curvature, launch_position, vacuumLaunch_flag=True, relativistic_flag=False, find_B_method='torbeam', density_fit_parameters=None, temperature_fit_parameters=None, shot=None, equil_time=None, vacuum_propagation_flag=False, Psi_BC_flag=None, poloidal_flux_enter=1.0, poloidal_flux_zero_density=1.0, poloidal_flux_zero_temperature=1.0, auto_delta_sign=True, delta_R=-0.0001, delta_Z=0.0001, delta_K_R=0.1, delta_K_zeta=0.1, delta_K_Z=0.1, interp_order=5, len_tau=102, rtol=0.001, atol=1e-06, interp_smoothing=0, ne_data_path=PosixPath('.'), magnetic_data_path=PosixPath('.'), Te_data_path=PosixPath('.'), output_path=PosixPath('.'), input_filename_suffix='', output_filename_suffix='', figure_flag=True, detailed_analysis_flag=True, quick_run=False, plasmaLaunch_K=array([0., 0., 0.]), plasmaLaunch_Psi_3D_lab_Cartesian=array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]), density_fit_method=None, temperature_fit_method=None, B_T_axis=None, B_p_a=None, R_axis=None, minor_radius_a=None)#
Run the beam tracer
Overview#
- Initialise density fit parameters. One of:
spline with data from file
Stefanikova
O(3) polynomial
tanh
quadratic
See
profile_fitfor more detailsIf relativistic_flag enabled, initialise temperature fit parameters. Not yet fully implemented. One of:
spline with data from file
linear
See ‘profile_fit’ for more details
- Initialise magnetic field method. One of:
TORBEAM
OMFIT
analytical
EFIT++
UDA
curvy slab
test/test_notime
See
geometryfor more detailsInitialise beam launch parameters (vacuum/plasma). See
launchfor more details.Propagate single ray with IVP solver to find point where beam leaves plasma. See
ray_solverfor more detailsPropagate beam with IVP solver
Dump raw output
Analysis
- param poloidal_launch_angle_Torbeam:
Poloidal angle of antenna in TORBEAM convention
- type poloidal_launch_angle_Torbeam:
float
- param toroidal_launch_angle_Torbeam:
Toroidal angle of antenna in TORBEAM convention
- type toroidal_launch_angle_Torbeam:
float
- param launch_freq_GHz:
Frequency of the launched beam in GHz
- type launch_freq_GHz:
float
- param mode_flag:
Either
+/-1, used to determine which mode branch to use- type mode_flag:
int
- param launch_beam_width:
Width of the beam at launch
- type launch_beam_width:
float
- param launch_beam_curvature:
Curvatuve of the beam at launch
- type launch_beam_curvature:
float
- param launch_position:
Position of the antenna in cylindrical coordinates
- type launch_position:
FloatArray
- param vacuumLaunch_flag:
If
True, launch beam from vacuum, otherwise beam launch position is inside the plasma already- type vacuumLaunch_flag:
bool
- param vacuum_propagation_flag:
If
True, run solver from the launch position, and don’t use analytical vacuum propagation- type vacuum_propagation_flag:
bool
- param relativistic_flag:
If
True, generates a temperature profile from given data or parameters and applies relativistic corrections to electron mass.- type relativistic_flag:
bool
- param Psi_BC_flag:
If
None, do no special treatment at plasma-vacuum boundary Ifcontinuous, apply BCs for continuous ne but discontinuous gradient of ne Ifdiscontinuous, apply BCs for discontinuous ne UsingTrueorFalseis now deprecated- type Psi_BC_flag:
String
- param poloidal_flux_enter:
Normalised poloidal flux label of plasma boundary. If vacuum_propagation_flag, then this is where the solver begins. If Psi_BC_flag, then this is where the plasma-vacuum BCs are applied
- type poloidal_flux_enter:
float
- param poloidal_flux_zero_density:
At and above this normalised poloidal flux label, Scotty sets the electron density to zero
- type poloidal_flux_zero_density:
float
- param poloidal_flux_zero_temperature:
At and above this normalised poloidal flux label, Scotty sets the electron temperature to zero. This effectively negates any relativistic mass corrections.
- type poloidal_flux_zero_temperature:
float
- param plasmaLaunch_Psi_3D_lab_Cartesian:
\(\Psi\) of beam in lab Cartesian coordinates. Required if
vacuumLaunch_flagisFalse- type plasmaLaunch_Psi_3D_lab_Cartesian:
FloatArray
- param plasmaLaunch_K:
Wavevector of beam at launch. Required if
vacuumLaunch_flagisFalse- type plasmaLaunch_K:
FloatArray
- param delta_R:
Finite difference spacing to use for
R- type delta_R:
float
- param delta_Z:
Finite difference spacing to use for
Z- type delta_Z:
float
- param delta_K_R:
Finite difference spacing to use for
K_R- type delta_K_R:
float
- param delta_K_zeta:
Finite difference spacing to use for
K_zeta- type delta_K_zeta:
float
- param delta_K_Z:
Finite difference spacing to use for
K_Z- type delta_K_Z:
float
- param find_B_method:
See
create_magnetic_geometryfor more information.Common options:
"efitpp"uses magnetic field data from efitpp files directly"torbeam"uses magnetic field data from TORBEAM input files"omfit"is similar to"torbeam"but reads the data from JSON files"UDA_saved"reads EFIT data from numpy’s.npzfiles"analytical"uses a constant current density circular equilibrium
Or pass a
MagneticFieldinstance directly.- param density_fit_parameters:
A list of parameters to be passed to the
density_fit_methodconstructor. See the docs for the individual methods for the meaning of their parametersNote
These parameters should not include
poloidal_flux_zero_density- param density_fit_method:
Parameterisation of the density profile. Either a callable (see
ProfileFit), or one of the following options:"smoothing-spline": 1D smoothing spline (SmoothingSplineFit)"smoothing-spline-file": 1D smoothing spline constructed from file (SmoothingSplineFit.from_dat_file)"stefanikova": combination of modified hyperbolic \(\tan\) and a Gaussian (StefanikovaFit)"poly3"or"polynomial": \(n\)-th order polynomial (PolynomialFit)"tanh": hyperbolic \(\tan\) (TanhFit)"quadratic": constrained quadratic (QuadraticFit)
If
density_fit_methodis a string, then the correspondingDensityFitobject is constructed usingpoloidal_flux_zero_densityanddensity_fit_parameters."smoothing-spline-file"looks for a file calledne<input_filename_suffix>.datinne_data_path. It also usesinterp_orderandinterp_smoothinginstead ofdensity_fit_parameters.Deprecated since version 2.4.0: If
None(the default) is passed, the method will be guessed from the length ofdensity_fit_parameters. In this case,quadraticandtanhparameters _should_ includepoloidal_flux_zero_densityas the last value.- param temperature_fit_method:
Parameterisation of the temperature profile. Leverages the same ProfileFit class used for density. See density_fit_method for details.
- param len_tau:
Number of output
taupoints- type len_tau:
int
- param rtol:
Relative tolerance for ODE solver
- type rtol:
float
- param atol:
Absolute tolerance for ODE solver
- type atol:
float
- param quick_run:
If true, then run only the ray tracer and get an analytic estimate of the \(K\) cut-off location
- type quick_run:
bool
- param auto_delta_sign:
Boolean. Ensures that forward difference is always in negative poloidal flux gradient direction (into the plasma).
- Parameters:
poloidal_launch_angle_Torbeam (float)
toroidal_launch_angle_Torbeam (float)
launch_freq_GHz (float)
mode_flag (int)
launch_beam_width (float)
launch_beam_curvature (float)
vacuumLaunch_flag (bool)
relativistic_flag (bool)
find_B_method (str | MagneticField)
density_fit_parameters (Sequence | None)
temperature_fit_parameters (Sequence | None)
vacuum_propagation_flag (bool)
poloidal_flux_enter (float)
poloidal_flux_zero_density (float)
poloidal_flux_zero_temperature (float)
delta_R (float)
delta_Z (float)
delta_K_R (float)
delta_K_zeta (float)
delta_K_Z (float)
len_tau (int)
rtol (float)
atol (float)
quick_run (bool)
density_fit_method (str | Callable[[float | ndarray[tuple[int, ...], dtype[float64]]], float | ndarray[tuple[int, ...], dtype[float64]]] | None)
temperature_fit_method (str | Callable[[float | ndarray[tuple[int, ...], dtype[float64]]], float | ndarray[tuple[int, ...], dtype[float64]]] | None)
- Return type:
DataTree
- scotty.beam_me_up.create_magnetic_geometry(find_B_method, magnetic_data_path=None, input_filename_suffix='', interp_order=5, interp_smoothing=0, B_T_axis=None, R_axis=None, minor_radius_a=None, B_p_a=None, shot=None, equil_time=None, delta_R=None, delta_Z=None, **kwargs)#
Create an object representing the magnetic field geometry
- Parameters:
find_B_method (str | MagneticField)
magnetic_data_path (Path | None)
input_filename_suffix (str)
interp_order (int)
interp_smoothing (int)
B_T_axis (float | None)
R_axis (float | None)
minor_radius_a (float | None)
B_p_a (float | None)
shot (int | None)
equil_time (float | None)
delta_R (float | None)
delta_Z (float | None)
- Return type:
- scotty.beam_me_up.default_plots(dt, field, output_path, suffix)#
Save some simple figures
Allows one to quickly gain an insight into what transpired in the simulation
- Parameters:
dt (DataTree)
field (MagneticField)
output_path (Path)
suffix (str)
- Return type:
None
- scotty.beam_me_up.make_density_fit(method, poloidal_flux_zero_density, parameters, filename)#
Either construct a
ProfileFitinstance, or returnmethodif it’s already suitable. Suitable methods are callables that take an array of poloidal fluxes and return an array of densities.
- scotty.beam_me_up.make_temperature_fit(method, poloidal_flux_zero_temperature, parameters, filename)#
Either construct a
DensityFitinstance, or returnmethodif it’s already suitable. Suitable methods are callables that take an array of poloidal fluxes and return an array of temperatures.