scotty.beam_me_up module
Contents
scotty.beam_me_up module#
Plan#
Output everything to a file, and then do the analysis on that file.
Check that gradK_xi and such are done correctly, check that K_mag is calculated correctly when K_zeta is nonzero
Check that the calculation of Psi makes sense (and the rotation angle)
Check that K initial’s calculation makes sense
Notes
The loading of the input files was taken from integral_5 and modified.
I should launch the beam inside the last closed flux surface
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.
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 density
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
Start in vacuum, otherwise Psi_3D_beam_initial_cartersian does not get done properly
- 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, 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, verbose_output_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, auto_delta_sign_Z=1, auto_delta_sign_R=1)#
Run the beam tracer
- Initialise density fit parameters. One of:
spline with data from file
Stefanikova
O(3) polynomial
tanh
quadratic
See
profile_fit
for 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
geometry
for more detailsInitialise beam launch parameters (vacuum/plasma). See
launch
for more details.Propagate single ray with IVP solver to find point where beam leaves plasma. See
ray_solver
for more detailsPropagate beam with IVP solver
Dump raw output
Analysis
- Parameters
poloidal_launch_angle_Torbeam (float) – Poloidal angle of antenna in TORBEAM convention
toroidal_launch_angle_Torbeam (float) – Toroidal angle of antenna in TORBEAM convention
launch_freq_GHz (float) – Frequency of the launched beam in GHz
mode_flag (int) – Either
+/-1
, used to determine which mode branch to uselaunch_beam_width (float) – Width of the beam at launch
launch_beam_curvature (float) – Curvatuve of the beam at launch
launch_position (FloatArray) – Position of the antenna in cylindrical coordinates
vacuumLaunch_flag (bool) – If
True
, launch beam from vacuum, otherwise beam launch position is inside the plasma alreadyvacuum_propagation_flag (bool) – If
True
, run solver from the launch position, and don’t use analytical vacuum propagationrelativistic_flag (bool) – If
True
, generates a temperature profile from given data or parameters and applies relativistic corrections to electron mass.Psi_BC_flag (String) – 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 UsingTrue
orFalse
is now deprecatedpoloidal_flux_enter (float) – 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
poloidal_flux_zero_density (float) – At and above this normalised poloidal flux label, Scotty sets the electron density to zero
poloidal_flux_zero_temperature (float) – At and above this normalised poloidal flux label, Scotty sets the electron temperature to zero. This effectively negates any relativistic mass corrections.
plasmaLaunch_Psi_3D_lab_Cartesian (FloatArray) – \(\Psi\) of beam in lab Cartesian coordinates. Required if
vacuumLaunch_flag
isFalse
plasmaLaunch_K (FloatArray) – Wavevector of beam at launch. Required if
vacuumLaunch_flag
isFalse
delta_R (float) – Finite difference spacing to use for
R
delta_Z (float) – Finite difference spacing to use for
Z
delta_K_R (float) – Finite difference spacing to use for
K_R
delta_K_zeta (float) – Finite difference spacing to use for
K_zeta
delta_K_Z (float) – Finite difference spacing to use for
K_Z
find_B_method (Union[str, scotty.geometry.MagneticField]) –
See
create_magnetic_geometry
for 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.npz
files"analytical"
uses a constant current density circular equilibrium
Or pass a
MagneticField
instance directly.density_fit_parameters (Optional[Sequence]) –
A list of parameters to be passed to the
density_fit_method
constructor. See the docs for the individual methods for the meaning of their parametersNote
These parameters should not include
poloidal_flux_zero_density
density_fit_method (Optional[Union[str, Callable[[Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]], Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]]]]) –
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_method
is a string, then the correspondingDensityFit
object is constructed usingpoloidal_flux_zero_density
anddensity_fit_parameters
."smoothing-spline-file"
looks for a file calledne<input_filename_suffix>.dat
inne_data_path
. It also usesinterp_order
andinterp_smoothing
instead 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,quadratic
andtanh
parameters _should_ includepoloidal_flux_zero_density
as the last value.temperature_fit_method (Optional[Union[str, Callable[[Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]], Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]]]]) – Parameterisation of the temperature profile. Leverages the same ProfileFit class used for density. See density_fit_method for details.
len_tau (int) – Number of output
tau
pointsrtol (float) – Relative tolerance for ODE solver
atol (float) – Absolute tolerance for ODE solver
quick_run (bool) – If true, then run only the ray tracer and get an analytic estimate of the \(K\) cut-off location
auto_delta_sign_Z – A sign variable that takes on +1/-1. Ensures that forward differebce is always in negative poloidal flux gradient direction (into the plasma). Current implementation is flawed because the MagneticField has to be constructed in order to determine the intersection point and corresponding sign. Sign flip is thus subsequently applied throughout the code except for the already constructed field.
auto_delta_sign_R – Similar to auto_delta_sign_Z but for the R coordinate
- 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 (Union[str, scotty.geometry.MagneticField]) –
magnetic_data_path (Optional[pathlib.Path]) –
input_filename_suffix (str) –
interp_order (int) –
interp_smoothing (int) –
- Return type
- scotty.beam_me_up.make_density_fit(method, poloidal_flux_zero_density, parameters, filename)#
Either construct a
ProfileFit
instance, or returnmethod
if it’s already suitable. Suitable methods are callables that take an array of poloidal fluxes and return an array of densities.- Parameters
method (Optional[Union[str, Callable[[Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]], Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]]]]) –
poloidal_flux_zero_density (float) –
filename (Optional[Union[os.PathLike, str]]) –
- Return type
Callable[[Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]], Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]]
- scotty.beam_me_up.make_temperature_fit(method, poloidal_flux_zero_temperature, parameters, filename)#
Either construct a
DensityFit
instance, or returnmethod
if it’s already suitable. Suitable methods are callables that take an array of poloidal fluxes and return an array of temperatures.- Parameters
method (Optional[Union[str, Callable[[Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]], Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]]]]) –
poloidal_flux_zero_temperature (float) –
filename (Optional[Union[os.PathLike, str]]) –
- Return type
Callable[[Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]], Union[float, numpy.ndarray[Any, numpy.dtype[numpy.float64]]]]