Source code for lasy.optical_elements.chromatic_lens
from scipy.constants import c
from lasy.backend import xp
from .optical_element import OpticalElement
[docs]
class ChromaticLens(OpticalElement):
r"""
Class for a chromatic thin lens, with a varying refractive index depending on the wavelength.
Examples
--------
>>> R1 = 114.5e-3 # 1st ROC
>>> t1 = 3.4e-3 # lens thickness
>>> R2 = -114.5e-3 # 2nd ROC
>>> nFS = (
... lambda x: (
... 1
... + 0.6961663 / (1 - (0.0684043 / x) ** 2)
... + 0.4079426 / (1 - (0.1162414 / x) ** 2)
... + 0.8974794 / (1 - (9.896161 / x) ** 2)
... )
... ** 0.5
... )
>>> laser.apply_optics(Lens2(R1=R1, R2=R2, d=t1, n_func=nFS))
Parameters
----------
R1 : float
ROC of the first surface (>0 if convex)
R2 : float
ROC of the second surface (>0 if concave)
d : float
Thickness of the lens used to calculate the total phase shift.
Note that this optical element still assumes a thin optics.
n_func : function
Function that returns the refractive index given the wavelength in microns, taken from the website "https://refractiveindex.info".
e.g. for Fused Silica:
nFS = lambda x: (1+0.6961663/(1-(0.0684043/x)**2)+0.4079426/(1-(0.1162414/x)**2)+0.8974794/(1-(9.896161/x)**2))**.5
"""
def __init__(self, R1, R2, d, n_func):
self.R1 = R1
self.R2 = R2
self.d = d
self.n_func = n_func
[docs]
def amplitude_multiplier(self, x, y, omega):
"""
Return the amplitude multiplier.
Parameters
----------
x, y, omega : ndarrays of floats
Define points on which to evaluate the multiplier. Must have the same shape.
Returns
-------
multiplier : ndarray of complex numbers
Contains the value of the multiplier at the specified points
"""
lam = 2 * xp.pi * c / omega * 1e6 # Wavelength in microns
n = self.n_func(lam)
f = 1 / (
(n - 1)
* (1 / self.R1 - 1 / self.R2 + (n - 1) * self.d / (n * self.R1 * self.R2))
)
return xp.exp(-1j * omega * (x**2 + y**2) / (2 * c * f))