9.8. Malus law

with two polarizers and a lens to focus light

[1]:
from diffractio import np, sp, plt
from diffractio import nm, um, mm, degrees

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

from diffractio.vector_sources_XY import Vector_source_XY
from diffractio.vector_fields_XY import Vector_field_XY
from diffractio.vector_masks_XY import Vector_mask_XY

from py_pol.jones_vector import Jones_vector
from py_pol.jones_matrix import Jones_matrix

from matplotlib import cm
[2]:
num_data =  256
length = 1*mm
x0 = np.linspace(-length / 2, length / 2, num_data)
y0 = np.linspace(-length / 2, length / 2, num_data)
wavelength = 1* um
[3]:
## Generation of vector light source

u0 = Scalar_source_XY(x0, y0, wavelength)
u0.plane_wave(A=1)

E0 = Vector_source_XY(x0, y0, wavelength)
E0.constant_polarization(u=u0, v=(1/np.sqrt(2), 1j/np.sqrt(2)))
E0.pupil()
E0.draw('stokes')
../../_images/source_examples_vector_malus_law_3_0.png
[4]:
focal = 10*mm

t1 = Scalar_mask_XY(x0, y0, wavelength)
t1.lens(r0=(0,0), focal=focal)
t1.pupil()
t1.draw(kind='phase', percentage_intensity=0.01)
../../_images/source_examples_vector_malus_law_4_0.png
[5]:
p0 = Jones_matrix()
p0.diattenuator_perfect(azimuth=0*degrees)

P0 = Vector_mask_XY(x0,y0,wavelength)
P0.from_py_pol(p0)

P1 = Vector_mask_XY(x0,y0,wavelength)

p1 = Jones_matrix()


r_max = 10*um
xout = np.linspace(-r_max, r_max, 250)
yout = np.linspace(-r_max, r_max, 250)

[6]:
angles = np.linspace(-180*degrees,180*degrees, 91)
intensities = np.zeros_like(angles)
intensities2 = np.zeros_like(angles)

for i, angle in enumerate(angles):
    print(i, end="\r")
    p1.diattenuator_perfect(azimuth=angle)
    P1.from_py_pol(p1)

    Es = E0 * (P0 * P1)

    E1 = Es.apply_mask(t1, new_field=True)
    # E1.draw('fields')

    E2 = E1.VCZT(z=focal, xout=xout, yout=yout)
    #E2.draw('intensity')
    intensities2[i] = E2.intensity().mean()

    Is = E1.VCZT(z=focal,xout=0,yout=0)
    intensities[i] = (np.abs(Is[0])**2 + np.abs(Is[1])**2 + np.abs(Is[2])**2) / (num_data**1)

90
[7]:
plt.figure()
plt.plot(angles/degrees,intensities/intensities.max(),'b')
plt.grid('on')

plt.plot(angles/degrees,intensities2/intensities2.max(),'r--')
plt.grid('on')
../../_images/source_examples_vector_malus_law_7_0.png