8. Inteferences using Fresnel biprism

A classical experiment in Optics is the interference process by a Fresnel biprism. In order to obtain a interference, a monocromatic light beam needs to be divided into two coherent waves and join them again. This can be performed using a Fresnel biprism.

To analyze the inteference process, we have used the XY and XZ framework.

8.1. XY formalism

[1]:
from diffractio import degrees, mm, plt, sp, um, np
from diffractio.scalar_fields_XY import Scalar_field_XY
from diffractio.scalar_masks_XY import Scalar_mask_XY
from diffractio.scalar_sources_XY import Scalar_source_XY
number of processors: 8
total memory        : 7.5 Gb
available memory    : 55 %
max frequency       : 4000 GHz
[2]:
from matplotlib import rcParams
rcParams['figure.figsize']=(5,5)
rcParams['figure.dpi']=125

In the first place, we create a plane wave and mask it with a circular aperture.

[3]:
x0 = np.linspace(-.2*mm,.2*mm,1024)
y0 =  np.linspace(-.2*mm,.2*mm,1024)
wavelength = 0.6238 * um
[4]:
u0 = Scalar_source_XY(x=x0, y=y0, wavelength=wavelength)
u0.plane_wave()

t0 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t0.circle(r0=(0 * um, 0 * um), radius=(.2*mm,.2*mm))

After that, we generate a Fresnel Biprism mask. The field just after the Fresnel biprism is just the multiplication of the field by the two masks.

[5]:
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.biprism_fresnel(
    r0=(0 * um, 0 * um), width=.2*mm, height=5 * um, n=1.5)

u1 = t0 * t1 * u0

Then, we create a function in order to draw the intensity distribution at a distance z after the mask.

[6]:
def difraccion_biprism_Fresnel(u1, z_mask):
    """Computes and draws the intensity distribution of a light beam after a mask.

    Parameters:
    u1 (Scalar_field_XY): Field just after the mask.
    z_mask (float): Distance from the mask."""

    if z_mask>0:
        u2 = u1.RS(z=z_mask, new_field=True)
    else:
        u2 = u1

    u2.draw(kind='intensity')
    plt.title("$z={:2.2f}\,um$".format(z_mask), fontsize=24)

Now, let us show what is the light field just after the grating

[7]:
difraccion_biprism_Fresnel(u1, z_mask=0*mm)
../../../_images/source_examples_optics_fresnel_biprism_12_0.png

And now, at different increasing distances:

[8]:
difraccion_biprism_Fresnel(u1,z_mask=.3*mm)
../../../_images/source_examples_optics_fresnel_biprism_14_0.png
[9]:
difraccion_biprism_Fresnel(u1,z_mask=1*mm)
../../../_images/source_examples_optics_fresnel_biprism_15_0.png
[10]:
difraccion_biprism_Fresnel(u1,z_mask=2*mm)
../../../_images/source_examples_optics_fresnel_biprism_16_0.png
[11]:
difraccion_biprism_Fresnel(u1,z_mask=5*mm)
../../../_images/source_examples_optics_fresnel_biprism_17_0.png

Nevertheless, after a certain distance, the light from both biprism separates and interferences is not produced:

[12]:
difraccion_biprism_Fresnel(u1,z_mask=10*mm)
../../../_images/source_examples_optics_fresnel_biprism_19_0.png

We can see that fringes appear while the two beams, produced by it face of the Fresnel briprism, coincides in space.

8.2. XZ formalism

Now, let us show the same case for XZ formalism. In this case, we can see how light is modified by the briprism, as no Thin Element Approximation is necessary.

[13]:
from diffractio import degrees, mm, plt, sp, um, np
from diffractio.scalar_masks_XZ import Scalar_mask_XZ
from diffractio.scalar_sources_X import Scalar_source_X
[14]:
num_x = 1024*4
num_z = 1024*2
x0 = np.linspace(-75, 75, num_x)
z0_near = np.linspace(0*um, 25*um, num_z)
z0_all = np.linspace(0*um, 1000*um, num_z)

wavelength = 0.6238 * um

[15]:
u0 = Scalar_source_X(x=x0, wavelength=wavelength)
u0.plane_wave()

[16]:
t0 = Scalar_mask_XZ(x=x0, z=z0_near, wavelength=wavelength)
t0.biprism(r0=(0*um, 5*um), length=100*um, height=5*um, refraction_index=1.5, angle=0*degrees)
t0.incident_field(u0)

[17]:
t0.WPM(verbose=True)
Time = 2.93 s, time/loop = 1.43 ms
[18]:
t0.draw(kind='intensity', draw_borders=True)
[18]:
<matplotlib.image.AxesImage at 0x7f6948492e50>
../../../_images/source_examples_optics_fresnel_biprism_27_1.png
[19]:
t0.draw(kind='phase', draw_borders=True)
plt.xlim(0,25)
plt.ylim(-50,50);
../../../_images/source_examples_optics_fresnel_biprism_28_0.png
[20]:
u_far = Scalar_mask_XZ(x=x0, z=z0_all, wavelength=wavelength)
u_far.biprism(r0=(0*um, 5*um), length=100*um, height=5*um, refraction_index=1.5, angle=0*degrees)
u_far.incident_field(u0)

[21]:
u_far.WPM(verbose=True)
Time = 2.40 s, time/loop = 1.173 ms
[22]:
u_far.draw(kind='intensity', draw_borders=True)
plt.ylim(-50*um, 50*um)
[22]:
(-50.0, 50.0)
../../../_images/source_examples_optics_fresnel_biprism_31_1.png
[23]:
u_field_last_plane=u_far.profile_transversal(z0=500*um)
plt.xlim(-50*um, 50*um)
[23]:
(-50.0, 50.0)
../../../_images/source_examples_optics_fresnel_biprism_32_1.png

Here, we see the intensity distribution at z=500\(\mu\)m, showing the interference process.

In addition, in the XZ formalism we have a tool for interactively draws the profiles at different distances.

[42]:
%matplotlib widget
u_far.draw_profiles_interactive(kind='intensity')

image0

[25]:
%matplotlib inline
rcParams['figure.figsize']=(5,5)
rcParams['figure.dpi']=125

8.3. Polarization

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

from diffractio.vector_paraxial_sources_XY import Vector_paraxial_source_XY
from diffractio.vector_paraxial_masks_XY import Vector_paraxial_mask_XY
from diffractio.vector_paraxial_fields_XY import Vector_paraxial_field_XY

[27]:
x0 = np.linspace(-.2*mm,.2*mm,1024)
y0 =  np.linspace(-.2*mm,.2*mm,1024)
wavelength = 0.6238 * um

[28]:
u0=Scalar_source_XY(x0,y0,wavelength)
u0.plane_wave(A=1)
[29]:
EM0 = Vector_paraxial_source_XY(x0, y0, wavelength)
EM0.constant_wave(u0,v=[1/np.sqrt(2), 1/np.sqrt(2)])
[30]:
EM0.__draw_ellipses__(num_ellipses=(31,31), amplification=.75, color_line='r', head_width=2,
                     logarithm=False, normalize=True, cut_value='')
../../../_images/source_examples_optics_fresnel_biprism_43_0.png
[31]:
t0 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t0.circle(r0=(0 * um, 0 * um), radius=(200 * um, 200 * um))
[32]:
t1 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t1.biprism_fresnel(
    r0=(0 * um, 0 * um), width=200 * um, height=5 * um, n=1.5)

u1 = t0 * t1
[33]:
u1.draw(kind='phase');
../../../_images/source_examples_optics_fresnel_biprism_46_0.png
[34]:
EM1 = Vector_paraxial_mask_XY(x0, y0, wavelength)
EM1.polarizer_linear(azimuth=45*degrees)
EM1.apply_scalar_mask(u1)
EM1.draw()
<Figure size 625x625 with 0 Axes>
../../../_images/source_examples_optics_fresnel_biprism_47_1.png
[35]:
t2 = Scalar_mask_XY(x=x0, y=y0, wavelength=wavelength)
t2.two_levels(level1=0, level2=1)
[36]:
EM2 = Vector_paraxial_mask_XY(x0, y0, wavelength)
EM2.complementary_masks(t2, state_0=np.array([[1, 0], [0, 0]]), state_1=np.array([[0, 0],  [0, 1]]))
EM2.draw();
<Figure size 625x625 with 0 Axes>
../../../_images/source_examples_optics_fresnel_biprism_49_1.png
[37]:
EM3=EM0*EM1*EM2
[38]:
EM3.draw('ellipses', num_ellipses=(31,31), color_line='r', amplification=0.75, head_width=1);
../../../_images/source_examples_optics_fresnel_biprism_51_0.png
[39]:
EM4=EM3.RS(z=4*mm)
[40]:
EM4.__draw_ellipses__(num_ellipses=(31,31), color_line='r', amplification=0.75, head_width=1);
../../../_images/source_examples_optics_fresnel_biprism_53_0.png
[41]:
h1,h2=EM4.draw('intensities');
EM4.__draw_ellipses__(num_ellipses=(31,31), color_line='r', amplification=0.75, head_width=1, ax=h1);
EM4.__draw_ellipses__(num_ellipses=(31,31), color_line='r', amplification=0.75, head_width=1, ax=h2);
../../../_images/source_examples_optics_fresnel_biprism_54_0.png