6. Vector Fast Fourier Transform (VFFT)

The incident field is an vector field (Ex, Ey) and it is propagated and converted to (Ex,Ey,Ez)

[1]:
from diffractio import np, sp, plt
from diffractio import nm, um, mm, degrees
[2]:
from diffractio.scalar_masks_XY import Scalar_mask_XY
from diffractio.scalar_fields_XY import Scalar_field_XY
from diffractio.scalar_sources_XY import Scalar_source_XY

[3]:
from diffractio.vector_fields_XY import Vector_field_XY
from diffractio.vector_sources_XY import Vector_source_XY
from diffractio.vector_masks_XY import Vector_mask_XY

6.1. XY scheme

[4]:
size = 64 * um
x0 = np.linspace(-size / 2, size / 2, 1024)
y0 = np.linspace(-size / 2, size / 2, 1024)

wavelength = 0.6328 * um

[5]:
u0 = Scalar_source_XY(x0, y0, wavelength)
u0.gauss_beam(r0=(0, 0),
              w0=(16 * um, 16 * um),
              z0=0 * um,
              A=1,
              theta=0. * degrees,
              phi=0 * degrees)

u0.draw()

../../../_images/source_tutorial_algorithms_VFFT_7_0.png
[6]:
radius = 8 * um
t = Scalar_mask_XY(x0, y0, wavelength)
t.circle(r0=(0, 0), radius=radius)

[7]:
u1 = t * u0

EM1 = Vector_source_XY(x0, y0, wavelength)
EM1.constant_polarization(u=u1, v=(1, 0))

[8]:
EM1.draw(kind='ellipses',
         amplification=0.5,
         color_line='k',
         line_width=0.75,
         num_ellipses=(21, 21))

../../../_images/source_tutorial_algorithms_VFFT_10_0.png
[9]:
EM2 = EM1.VFFT(radius=64 * um,
               focal=10 * um,
               remove0=False,
               n=1,
               new_field=True,
               has_draw=False)

[10]:
x_resample = 8
EM2.cut_resample([-x_resample, x_resample], [-x_resample, x_resample],
                 num_points=(1024, 1024))

[11]:
EM2.draw('intensities', logarithm=1e-1)

../../../_images/source_tutorial_algorithms_VFFT_13_0.png
[12]:
EM2.draw('intensity', logarithm=1e-1)

../../../_images/source_tutorial_algorithms_VFFT_14_0.png

This result can be compared to the scalar FFT result.

[13]:
u_fft = u1.fft(z=15 * um, new_field=True, remove0=False)
u_fft.cut_resample(x_limits=(-x_resample, x_resample),
                   y_limits=(-x_resample, x_resample))
u_fft.draw(logarithm=1e-2, has_colorbar='horizontal')

../../../_images/source_tutorial_algorithms_VFFT_16_0.png
[ ]: