Fresnel Chirp-Z Transform Propagator#

class lasy.propagators.FresnelChirpZPropagator[source]#

Class that represents a Fresnel propagator based upon the Chirp-Z Transform.

The propagated field is calculated via the following method:

Given a scalar field \(E_0(x',y',0,\omega)\), one writes the propagated field at a distance \(z\), under the Fresnel approximation, as:

\[E (x,y,z,\omega) = \frac{ \omega \exp{(\frac{i \omega z}{c}) \exp(i\omega\frac{x^2+y^2}{2 c z})}}{i 2 \pi c z} \int \int E_0(x',y',0,\omega) \times \exp{\left [\frac{i\omega}{2 c z}(x'^2 + y'^2) \right ]}\times \exp{\left[ \frac{i \omega}{c z} (xx' +yy')\right]} dx' dy'\]

which can be rewritten as a 2D Fourier transform \(\mathcal{F}\):

\[E (x,y,z,\omega) = G \times \mathcal{F}(E_0 \times H)\]

where \(G\) is given by:

\[G = \frac{ \omega \exp{(\frac{i \omega z}{c}) \exp(i\omega\frac{x^2+y^2}{2 c z})}}{i 2 \pi c z}\]

and where \(H\) is given by:

\[H = \exp{\left [\frac{i\omega}{2 c z}(x'^2 + y'^2) \right ]}\]

Normally, the Fourier transform is computed using the Fast Fourier Transform (FFT) algorithm. However, in this case, the Chirp-Z Transform (or Zoom FFT) is used to compute the Fourier transform. This allows for more flexibility in choosing both the initial and final sampling of the Fourier transform.

The algorithm is based upon the work by Hu et al., https://www.nature.com/articles/s41377-020-00362-z and the implementation of the Chirp-Z Transform in SciPy, specifically scipy.signal.zoom_fft.

Parameters:
omega0float (in rad/s)

The center frequency of the laser field.

dimstring

Dimensionality of the array. Options are:

  • 'xyt': The laser pulse is represented on a 3D grid:

    Cartesian (x,y) transversely, and temporal (t) longitudinally.

Examples

>>> from lasy.laser import Laser
>>> from lasy.profiles.gaussian_profile import GaussianProfile
>>> from lasy.optical_elements import ParabolicMirror
>>> from lasy.propagators import FresnelChirpZPropagator
>>> from lasy.utils.grid import Grid
>>> from lasy.backend import xp
>>> # Create profile.
>>> profile = GaussianProfile(
...     wavelength=0.8e-6,  # m
...     pol=(1, 0),
...     laser_energy=1.0,  # J
...     w0=5e-3,  # m
...     tau=30e-15,  # s
...     t_peak=0.0,  # s
... )
>>> # Create laser with given profile in `xyt` geometry.
>>> laser = Laser(
...     dim="xyt",
...     lo=(-15e-3, -15e-3, -60e-15),
...     hi=(15e-3, 15e-3, +60e-15),
...     npoints=(200, 200, 500),
...     profile=profile,
... )
>>> # Add Focusing Phase.
>>> focal_length = 1  # m
>>> laser.apply_optics(ParabolicMirror(focal_length))
>>> # Add Fresnel Chirp-Z propagator.
>>> laser.add_propagator(FresnelChirpZPropagator())
>>> # Create a new resampled grid for propagation.
>>> xLimNew = 150e-6  # m
>>> newGrid = Grid(
...     laser.dim,
...     (-xLimNew, -xLimNew, laser.grid.lo[2]),
...     (xLimNew, xLimNew, laser.grid.hi[2]),
...     (100, 100, laser.grid.npoints[2]),
... )
>>> # Propagate the laser pulse to the focal plane and visualise.
>>> laser.propagate(focal_length, grid_out=newGrid)
>>> laser.show(envelope_type="intensity")
>>> w0theory = 0.8e-6 * focal_length / (xp.pi * 5e-3)
>>> print("w0 theoretical: %.2e m" % (w0theory))
propagate(grid_in, dim=None, omega0=None, distance=None, grid_out=None)[source]#

Propagates the laser field in z direction by a given distance using the Chirp-Z Transform method.

Parameters:
grid_inGrid

Grid object containing the laser to propagate.

dimstring (optional)

Dimensionality of the array. If not provided, uses the propagator’s dimension.

omega0float (in rad/s) (optional)

The center frequency of the laser field. If not provided, uses the propagator’s frequency.

distancescalar

Distance by which the laser is propagated.

grid_outGrid object (optional)

Grid object on which the propagated laser pulse is defined. Can be different from laser grid before propagation.

Returns:
Grid object with laser data after propagation.
update(dim, omega0)[source]#

Initialize or update the propagator if needed.

Parameters:
dimstring

Dimensionality of the array. Options are: - 'xyt': Laser pulse represented on a 3D Cartesian grid. - 'rt' : Laser pulse represented on a 2D cylindrical grid.

omega0float (in rad.s^-1)

The main frequency \(\omega_0\), which is defined by the laser wavelength \(\lambda_0\), as \(\omega_0 = 2\pi c/\lambda_0\).