8.10. Laser

8.10.1. Laser Spectrum

class cherab.core.model.laser.laserspectrum.ConstantSpectrum

A laser spectrum with constant power.

Has a constant, non-zero distribution of power spectral density between the min_wavelength and max_wavelength. The integral value of the power is 1 W.

Note

The ConstantSpectrum class is suitable for approximation of an infinitely thin laser spectrum, e.g.: ConstantSpectrum(1063.9, 1064.1, 1)

class cherab.core.model.laser.laserspectrum.GaussianSpectrum

A laser spectrum with a normally distributed power spectral density.

Has a Gaussian-like spectral shape. The inegral value of power is 1 W.

Parameters:
  • mean (float) – The mean value of the Gaussian distribution of the laser spectrum in nm, can be thought of as the central wavelength of the laser.

  • stddev (float) – Standard deviation of the Gaussian distribution of the laser spectrum.

Variables:
  • stddev (float) – Standard deviation of the Gaussian distribution of the laser spectrum.

  • mean (float) – The mean value of the Gaussian distribution of the laser spectrum in nm, can be thought of as the central wavelength of the laser.

8.10.2. Laser Profile

class cherab.core.model.laser.profile.UniformEnergyDensity

LaserProfile with a constant volumetric energy density.

Returns a laser with a cylindrical shape within which the laser volumentric energy density is constant. The laser starts at z=0 and extends in the positive z direction.

In the following example, a laser of length of 2 m (extending from z=0 to z=2 m) with a radius of 3 cm and volumetric energy density of 5 J*m^-3 and polarisation in the y direction is created:

>>> from raysect.core import Vector3D
>>> from cherab.core.model.laser import UniformEnergyDensity

>>> energy = 5 # energy density in J
>>> radius = 3e-2 # laser radius in m
>>> length = 2 # laser length in m
>>> polarisation = Vector3D(0, 1, 0) # polarisation direction

    # create the laser profile
>>> laser_profile = UniformEnergyDensity(energy, radius, length, polarisation)
Parameters:
  • energy_density (float) – The volumetric energy density of the laser light.

  • laser_length (float) – The length of the laser cylinder.

  • laser_radius (float) – The radius of the laser cylinder.

  • polarization (Vector3D) – The direction of the laser polarization:

Variables:
  • energy_density (float) – The volumetric energy density of the laser light.

  • laser_radius (float) – The radius of the laser cylinder.

  • laser_length (float) – The length of the laser cylinder.

generate_geometry()

returns list of raysect primitives composing the laser geometry

This method is called from the Laser instance to which the instance of Profile is attached to. The Laser instance will be assigned as the parent to the returned primitives in the Laser._configure method. The Laser._configure method does not change any transforms. This is why the returned primitives have to have their transforms already initialised in the frame of the laser, when returned.

class cherab.core.model.laser.profile.ConstantBivariateGaussian

LaserProfile with a Gaussian-shaped volumetric energy density distribution in the xy plane and constant pulse intensity.

Returns a laser with a cylindrical shape and the propagation of the laser light in the positive z direction.

The model imitates a laser beam with a uniform power output within a single pulse. This results in the distribution of the energy density along the propagation direction of the laser (z-axis) to be also uniform. The integral value of laser energy Exy in an x-y plane is given by

\[E_{xy} = \frac{E_p}{(c * \tau)},\]

where Ep is the energy of the laser pulse, tau is the temporal pulse length and c is the speed of light in vacuum. In an x-y plane, the volumetric energy density follows a bivariate Gaussian with a zero correlation:

\[E(x, y) = \frac{E_{xy}}{2 \pi \sigma_x \sigma_y} exp\left(-\frac{x^2 + y^2}{2 \sigma_x \sigma_y}\right).\]

The sigma_x and sigma_y are standard deviations in x and y directions, respectively.

Note

The height of the cylinder, forming the laser beam, is given by the laser_length and is independent from the temporal length of the laser pulse given by pulse_length. This gives the possibility to independently control the size of the laser primitive and the value of the volumetric energy density.

The methods get_pointing, get_polarization and get_energy_density are not limited to the inside of the laser cylinder. If called for position (x, y, z) outisde the laser cylinder, they can still return non-zero values.

The following example shows how to create a laser with sigma_x= 1 cm and sigma_y=2 cm, which makes the laser profile in x-y plane to be elliptical. The pulse energy is 5 J and the laser temporal pulse length is 10 ns:

>>> from raysect.core import Vector3D
>>> from cherab.core.model.laser import ConstantBivariateGaussian

>>> radius = 3e-2 # laser radius in m
>>> length = 2 # laser length in m
>>> polarisation = Vector3D(0, 1, 0) # polarisation direction
>>> pulse_energy = 5 # energy in a laser pulse in J
>>> pulse_length = 1e-8 # pulse length in s
>>> width_x = 1e-2 # standard deviation in x direction in m
>>> width_y = 2e-2 # standard deviation in y direction in m

    # create the laser profile
>>> laser_profile = ConstantBivariateGaussian(pulse_energy, pulse_length, radius, length, width_x, width_y, polarisation)
Parameters:
  • pulse_energy (float) – The energy of the laser in Joules delivered in a single laser pulse.

  • pulse_length (float) – The temporal length of the laser pulse in seconds.

  • laser_length (float) – The length of the laser cylinder.

  • laser_radius (float) – The radius of the laser cylinder.

  • stddev_x (float) – The standard deviation of the bivariate Gaussian distribution of the volumetric energy density distribution of the laser light in the x axis in meters.

  • stddev_y (float) – The standard deviation of the bivariate Gaussian distribution of the volumetric energy density distribution of the laser light in the y axis in meters.

  • polarization (Vector3D) – The direction of the laser polarization:

Variables:
  • pulse_energy (float) – The energy of the laser in Joules delivered in a single laser pulse.

  • pulse_length (float) – The temporal length of the laser pulse in seconds.

  • laser_radius (float) – The radius of the laser cylinder.

  • laser_length (float) – The length of the laser cylinder.

  • stddev_x (float) – The standard deviation of the bivariate Gaussian distribution of the volumetric energy density distribution of the laser light in the x axis in meters.

  • stddev_y (float) – The standard deviation of the bivariate Gaussian distribution of the volumetric energy density distribution of the laser light in the y axis in meters.

generate_geometry()

returns list of raysect primitives composing the laser geometry

This method is called from the Laser instance to which the instance of Profile is attached to. The Laser instance will be assigned as the parent to the returned primitives in the Laser._configure method. The Laser._configure method does not change any transforms. This is why the returned primitives have to have their transforms already initialised in the frame of the laser, when returned.

class cherab.core.model.laser.profile.TrivariateGaussian

LaserProfile with a trivariate Gaussian-shaped volumetric energy density.

Returns a laser with a cylindrical shape and the propagation of the laser light in the positive z direction. This model imitates a laser beam with a Gaussian distribution of power output within a single pulse frozen in time:

\[E(x, y, z) = \frac{E_p}{\sqrt{2 \pi^3} \sigma_x \sigma_y \sigma_z} exp\left(-\frac{x^2}{2 \sigma_x^2} -\frac{y^2}{2 \sigma_y^2} -\frac{(z - \mu_z)^2}{2 \sigma_z^2}\right).\]

The sigma_x and sigma_y are standard deviations in x and y directions, respectively, and E_p is the energy deliverd by laser in a single laser pulse. The mu_z is the mean of the distribution in the z direction and controls th position of the laser pulse along the z direction. The standard deviation in z direction sigma_z is calculated from the pulse length tau_p, which is the standard deviation of the Gaussian distributed ouput power of the laser within a single pulse:

\[\sigma_z = \tau_p c.\]

The c stands for the speed of light in vacuum.

Note

The height of the cylinder, forming the laser beam, is given by the laser_length and is independent from the temporal length of the laser pulse given by pulse_length. This gives the possibility to independently control the size of the laser primitive and the value of the volumetric energy density.

The methods get_pointing, get_polarization and get_energy_density are not limited to the inside of the laser cylinder. If called alone for position (x, y, z) outisde the laser cylinder, they can still return non-zero values.

The following example shows how to create a laser with sigma_x = 1 cm and sigma_y = 2 cm, which makes the laser profile in an x-y plane to be elliptical. The pulse energy is 5 J and the laser temporal pulse length is 10 ns. The position of the laser pulse maximum mean_z is set to 0.5:

>>> from raysect.core import Vector3D
>>> from cherab.core.model.laser import ConstantBivariateGaussian

>>> radius = 3e-2 # laser radius in m
>>> length = 2 # laser length in m
>>> polarisation = Vector3D(0, 1, 0) # polarisation direction
>>> pulse_energy = 5 # energy in a laser pulse in J
>>> pulse_length = 1e-8 # pulse length in s
>>> pulse_z = 0.5 # position of the pulse mean
>>> width_x = 1e-2 # standard deviation in x direction in m
>>> width_y = 2e-2 # standard deviation in y direction in m

    # create the laser profile
>>> laser_profile = ConstantBivariateGaussian(pulse_energy, pulse_length, pulse_z, radius, length, width_x, width_y, polarisation)
Parameters:
  • pulse_energy (float) – The energy of the laser in Joules delivered in a single laser pulse.

  • pulse_length (float) – The standard deviation of the laser pulse length in the temporal domain.

  • mean_z (float) – Position of the mean value of the laser pulse in the z direction. Can be used to control the position of the laser pulse along the laser propagation.

  • laser_length (float) – The length of the laser cylinder.

  • laser_radius (float) – The radius of the laser cylinder.

  • stddev_x (float) – The standard deviation of the bivariate Gaussian distribution of the volumetric energy density distribution of the laser light in the x axis in meters.

  • stddev_y (float) – The standard deviation of the bivariate Gaussian distribution of the volumetric energy density distribution of the laser light in the y axis in meters.

  • polarization (Vector3D) – The direction of the laser polarization.

Variables:
  • pulse_energy (float) – The energy of the laser in Joules delivered in a single laser pulse.

  • pulse_length (float) – The standard deviation of the laser pulse length in the temporal domain.

  • mean_z (float) – Position of the mean value of the laser pulse in the z direction. Can be used to control the position of the laser pulse along the laser propagation.

  • laser_radius (float) – The radius of the laser cylinder.

  • laser_length (float) – The length of the laser cylinder.

  • stddev_x (float) – The standard deviation of the bivariate Gaussian distribution of the volumetric energy density distribution of the laser light in the x axis in meters.

  • stddev_y (float) – The standard deviation of the bivariate Gaussian distribution of the volumetric energy density distribution of the laser light in the y axis in meters.

generate_geometry()

returns list of raysect primitives composing the laser geometry

This method is called from the Laser instance to which the instance of Profile is attached to. The Laser instance will be assigned as the parent to the returned primitives in the Laser._configure method. The Laser._configure method does not change any transforms. This is why the returned primitives have to have their transforms already initialised in the frame of the laser, when returned.

class cherab.core.model.laser.profile.GaussianBeamAxisymmetric

LaserProfile with volumetric energy density following the Gaussian beam model.

Returns a laser with a cylindrical shape and the propagation of the laser light in the positive z direction. This model implements the axisymmetrical Gaussian beam model. It immitates a focused axis symmetrical laser beam with a uniform power ouput in a laser pulse. The volumetric energy density is given by

\[\begin{split}E(x, y, z) = \frac{E_{xy}}{2 \pi \sigma^2(z)} exp\left( -\frac{x^2 + y^2}{2 \sigma^2(z) }\right) \\\end{split}\]

where the sigma is the standard deviation of the Gaussian shape in the xy plane and is given by

\[sigma(z) = \sigma_0 \sqrt{1 + \left(\frac{z - z_0}{z_R}\right)^2}.\]

The z_0 is the position of the beam focus and z_R is the Rayleigh length

\[z_R = \frac{\pi \omega_0^2 n}{\lambda_l}\]

where the omega_0 is the standard deviation in the xy plane in the focal point (beam waist) and lambda_l is the central wavelength of the laser. The E_xy stand for the laser energy in an xy plane and is calculated as:

\[E_{xy} = \frac{E_p}{(c * \tau)},\]

where the E_p is the energy in a single laser pulse and tau is the temporal pulse length.

Note

For more information about the Gaussian beam model see https://en.wikipedia.org/wiki/Gaussian_beam

The methods get_pointing, get_polarization and get_energy_density are not limited to the inside of the laser cylinder. If called alone for position (x, y, z) outisde the laser cylinder, they can still return non-zero values.

The following example shows how to create a laser with pulse energy 5J, pulse length 10 ns and with the laser cylinder primitive being 2m long with 5 cm in diameter. The the standard deviation of the beam in the focal point (waist) is 5mm and the position of the waist is z=50 cm. The laser wavelength is 1060 nm.

>>> from raysect.core import Vector3D
>>> from cherab.core.model.laser import GaussianBeamAxisymmetric

>>> radius = 5e-2 # laser radius in m
>>> length = 2 # laser length in m
>>> polarisation = Vector3D(0, 1, 0) # polarisation direction
>>> pulse_energy = 5 # energy in a laser pulse in J
>>> pulse_length = 1e-8 # pulse length in s
>>> waist_width = 5e-3 # standard deviation in the waist
>>> waist_z = 0.5 # position of the pulse mean
>>> width_x = 1e-2 # standard deviation in x direction in m
>>> width_y = 2e-2 # standard deviation in y direction in m
>>> laser_wlen = 1060 # laser wavelength in nm

    # create the laser profile
>>> laser_profile = GaussianBeamAxisymmetric(pulse_energy, pulse_length, length, radius, waist_z, waist_width, laser_wlen)
Parameters:
  • pulse_energy (float) – The energy of the laser in Joules delivered in a single laser pulse.

  • pulse_length (float) – The temporal length of the laser pulse in seconds.

  • laser_length (float) – The length of the laser cylinder in meters.

  • laser_radius (float) – The radius of the laser cylinder in meters.

  • waist_z (float) – Position of the laser waist along the z axis in m.

  • stddev_waist (float) – The standard deviation of the laser width in the focal point (waist) in m.

  • laser_wavelength (float) – The central wavelength of the laser light in nanometers.

  • polarization (Vector3D) – The direction of the laser polarization.

Variables:
  • pulse_energy (float) – The energy of the laser in Joules delivered in a single laser pulse.

  • pulse_length (float) – The temporal length of the laser pulse in seconds.

  • laser_length (float) – The length of the laser cylinder in meters.

  • laser_radius (float) – The radius of the laser cylinder in meters.

  • waist_z (float) – Position of the laser waist along the z axis in m.

  • stddev_waist (float) – The standard deviation of the laser width in the focal point (waist) in m.

  • laser_wavelength (float) – The central wavelength of the laser light in nanometers.

  • polarization (Vector3D) – The direction of the laser polarization.

generate_geometry()

returns list of raysect primitives composing the laser geometry

This method is called from the Laser instance to which the instance of Profile is attached to. The Laser instance will be assigned as the parent to the returned primitives in the Laser._configure method. The Laser._configure method does not change any transforms. This is why the returned primitives have to have their transforms already initialised in the frame of the laser, when returned.

8.10.3. Laser Model

class cherab.core.model.laser.model.SeldenMatobaThomsonSpectrum

Thomson Scattering based on Selden-Matoba.

The class calculates Thomson scattering of the laser to the spectrum. The model of the scattered spectrum used is based on the semi-empirical model by Selden and the Thomson scattering cross-section is taken from Matoba articles. The spectral contribution of the scattered laser light c is calculated as a sum of contributions of all laser wavelengths

\[\begin{split}c(\lambda) = c r_e^2 n_e cos^2\\theta \\sum_{\\lambda_L} \\frac{E_L(\\lambda_l) S(\\frac{\\lambda}{\\lambda_L} - 1, \\varphi, T_e)}{\\lambda_L},\end{split}\]

where \(\\lambda\) is the spectrum’s wavelength, \(r_e\) is the classical electron radius, \(n_e\) is the electron delsity, \(\\theta\) is the angle between the laser polarisation and scattering vectors, \(c\) is the vacuum speed of light \(\\lambda_L\) is the laser wavelength, \(E_L\) is the laser energy density, \(\\varphi\) is the scattering angle and \(T_e\) is the electron temperature. The scattering function S is taken from the Matoba article. The multiplication by the speed of light is added to transfer the Thomson scattering cross section into a reaction rate.

See also

The Prunty article provides a thorough introduction into the phyiscs of Thomson scattering. The articles by Selden and Matoba were used to build this model.

Selden:

Selden, A.C., 1980. Simple analytic form of the relativistic Thomson scattering spectrum. Physics Letters A, 79(5-6), pp.405-406.

Matoba:

Matoba, T., et al., 1979. Analytical approximations in the theory of relativistic Thomson scattering for high temperature fusion plasma. Japanese Journal of Applied Physics, 18(6), p.1127.

Prunty:

Prunty, S.L., 2014. A primer on the theory of Thomson scattering for high-temperature fusion plasmas. Physica Scripta, 89(12), p.128001.

calculate_spectrum(ne, te, laser_energy_density, laser_wavelength, observation_angle, angle_polarization, spectrum)

Calculates scattered spectrum for the given parameters.

The method returns the Thomson scattered spectrum given the plasma parameters, without the need of specifying plasma or laser.

Parameters:
  • ne (float) – Plasma electron density in m**-3

  • te (float) – Plasma electron temperature in eV

  • laser_energy_density (float) – Energy density of the laser light in J * m**-3

  • laser_wavelength (float) – The laser light wavelength in nm

  • observation_angle (float) – The angle of observation is the angle between the observation direction and the direction of the Poynting vector.

  • angle_polarization (float) – The angle between the observation direction and the polarisation direction of the laser light.

Returns:

Spectrum