590 lines
62 KiB
Plaintext
590 lines
62 KiB
Plaintext
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"# Gaussian Beam Propagation"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Import files"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 1,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"import BeamPropagation as bs # This is the script that handles the propagation\n",
|
||
|
"import sympy as sym # For Symbolic examples\n",
|
||
|
"import numpy as np # Handling of lists and for plotting\n",
|
||
|
"import matplotlib.pyplot as plt # Plotting"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Let's show what BeamProp_Script has"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 2,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Help on module BeamProp_Script:\n",
|
||
|
"\n",
|
||
|
"NAME\n",
|
||
|
" BeamProp_Script - Created on Wed Feb 19 15:51:54 2020\n",
|
||
|
"\n",
|
||
|
"DESCRIPTION\n",
|
||
|
" @author: wrighta\n",
|
||
|
"\n",
|
||
|
"FUNCTIONS\n",
|
||
|
" W0(zr, lam)\n",
|
||
|
" Parameters\n",
|
||
|
" ----------\n",
|
||
|
" zr : float, integer, symbol\n",
|
||
|
" Rayleigh range in meters\n",
|
||
|
" lam : float, integer, symbol\n",
|
||
|
" Wavelength of light in meters\n",
|
||
|
" \n",
|
||
|
" Returns\n",
|
||
|
" -------\n",
|
||
|
" w0 : float, integer, symbol\n",
|
||
|
" Beam waist radius in meters\n",
|
||
|
" \n",
|
||
|
" Zr(wo, lam)\n",
|
||
|
" Parameters\n",
|
||
|
" ----------\n",
|
||
|
" wo : float, integer, or symbol\n",
|
||
|
" Beam waist radius in meters.\n",
|
||
|
" lam : float, integer, or symbol\n",
|
||
|
" Wavelength of light in meters.\n",
|
||
|
" \n",
|
||
|
" Returns\n",
|
||
|
" -------\n",
|
||
|
" zr : float, int, symbols\n",
|
||
|
" Rayleigh range for given beam waist and wavelength.\n",
|
||
|
" \n",
|
||
|
" lens(f)\n",
|
||
|
" Parameters\n",
|
||
|
" ----------\n",
|
||
|
" f : float or integer or sympy symbol in meters\n",
|
||
|
" Thin lens focal length in meters\n",
|
||
|
" \n",
|
||
|
" Returns\n",
|
||
|
" -------\n",
|
||
|
" mat : 2x2 matrix\n",
|
||
|
" [\n",
|
||
|
" [ 1, 0],\n",
|
||
|
" [-1/f, 1]\n",
|
||
|
" ]\n",
|
||
|
" \n",
|
||
|
" mult(mat1, *argv)\n",
|
||
|
" Parameters\n",
|
||
|
" ----------\n",
|
||
|
" mat1 : 2x2 ABCD matrix\n",
|
||
|
" Last matrix light interacts with.\n",
|
||
|
" *argv : 2x2 ABCD matrices \n",
|
||
|
" From left to right, the matrices should be entered such that the leftmost matrix interacts\n",
|
||
|
" with light temporally after the rightmost matrix.\n",
|
||
|
" \n",
|
||
|
" Returns\n",
|
||
|
" -------\n",
|
||
|
" Mat : 2x2 matrix\n",
|
||
|
" The ABCd matrix describing the whole optical system.\n",
|
||
|
" \n",
|
||
|
" plot(func, var, rang=array([0. , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ,\n",
|
||
|
" 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,\n",
|
||
|
" 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32,\n",
|
||
|
" 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43,\n",
|
||
|
" 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,\n",
|
||
|
" 0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65,\n",
|
||
|
" 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76,\n",
|
||
|
" 0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87,\n",
|
||
|
" 0.88, 0.89, 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98,\n",
|
||
|
" 0.99, 1. , 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09,\n",
|
||
|
" 1.1 , 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2 ,\n",
|
||
|
" 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3 , 1.31,\n",
|
||
|
" 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38, 1.39, 1.4 , 1.41, 1.42,\n",
|
||
|
" 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5 , 1.51, 1.52, 1.53,\n",
|
||
|
" 1.54, 1.55, 1.56, 1.57, 1.58, 1.59, 1.6 , 1.61, 1.62, 1.63, 1.64,\n",
|
||
|
" 1.65, 1.66, 1.67, 1.68, 1.69, 1.7 , 1.71, 1.72, 1.73, 1.74, 1.75,\n",
|
||
|
" 1.76, 1.77, 1.78, 1.79, 1.8 , 1.81, 1.82, 1.83, 1.84, 1.85, 1.86,\n",
|
||
|
" 1.87, 1.88, 1.89, 1.9 , 1.91, 1.92, 1.93, 1.94, 1.95, 1.96, 1.97,\n",
|
||
|
" 1.98, 1.99, 2. , 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08,\n",
|
||
|
" 2.09, 2.1 , 2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19,\n",
|
||
|
" 2.2 , 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, 2.3 ,\n",
|
||
|
" 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4 , 2.41,\n",
|
||
|
" 2.42, 2.43, 2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5 , 2.51, 2.52,\n",
|
||
|
" 2.53, 2.54, 2.55, 2.56, 2.57, 2.58, 2.59, 2.6 , 2.61, 2.62, 2.63,\n",
|
||
|
" 2.64, 2.65, 2.66, 2.67, 2.68, 2.69, 2.7 , 2.71, 2.72, 2.73, 2.74,\n",
|
||
|
" 2.75, 2.76, 2.77, 2.78, 2.79, 2.8 , 2.81, 2.82, 2.83, 2.84, 2.85,\n",
|
||
|
" 2.86, 2.87, 2.88, 2.89, 2.9 , 2.91, 2.92, 2.93, 2.94, 2.95, 2.96,\n",
|
||
|
" 2.97, 2.98, 2.99]))\n",
|
||
|
" Parameters\n",
|
||
|
" ----------\n",
|
||
|
" func : Sympy function of one variable\n",
|
||
|
" Sympy function defining the beam width after the last optical element.\n",
|
||
|
" var : sympy variable\n",
|
||
|
" Variable in func that will be plotted.\n",
|
||
|
" rang : numpy array\n",
|
||
|
" Array of the values along the optical axis to be plotted\n",
|
||
|
" \n",
|
||
|
" Returns\n",
|
||
|
" -------\n",
|
||
|
" plot : matplotlib graph\n",
|
||
|
" Graph of the beam width of var\n",
|
||
|
" \n",
|
||
|
" prop(d)\n",
|
||
|
" Parameters\n",
|
||
|
" ----------\n",
|
||
|
" d : float or integer or sympy symbol\n",
|
||
|
" Distance light is propagating along the z-axis.\n",
|
||
|
" \n",
|
||
|
" Returns\n",
|
||
|
" -------\n",
|
||
|
" mat: 2x2 matrix\n",
|
||
|
" [\n",
|
||
|
" [1, d],\n",
|
||
|
" [0, 1]\n",
|
||
|
" ]\n",
|
||
|
" \n",
|
||
|
" q1_func(z, w0, lam, mat)\n",
|
||
|
" Parameters\n",
|
||
|
" ----------\n",
|
||
|
" z : float, int, symbol\n",
|
||
|
" Position of the beam waist in meters.\n",
|
||
|
" w0 : float, int, symbol\n",
|
||
|
" Radial waist size in meters (of the embedded Gaussian, i.e. W0/M).\n",
|
||
|
" lam : float, int, symbol\n",
|
||
|
" Wavelength of light in meters.\n",
|
||
|
" mat : float, int, symbol\n",
|
||
|
" The ABCD 2x2 matrix describing the optical system.\n",
|
||
|
" \n",
|
||
|
" Returns\n",
|
||
|
" -------\n",
|
||
|
" z: float, int, symbol\n",
|
||
|
" Position of the beam waist after the optical system\n",
|
||
|
" zr: float, int, symbol\n",
|
||
|
" Rayleigh range of the beam after the optical system\n",
|
||
|
" \n",
|
||
|
" q1_inv_func(z, w0, lam, mat)\n",
|
||
|
" Parameters\n",
|
||
|
" ----------\n",
|
||
|
" z : float, int, symbol\n",
|
||
|
" Position of the beam waist in meters.\n",
|
||
|
" w0 : float, int, symbol\n",
|
||
|
" Radial waist size in meters (of the embedded Gaussian, i.e. W0/M).\n",
|
||
|
" lam : float, int, symbol\n",
|
||
|
" Wavelength of light in meters.\n",
|
||
|
" mat : float, int, symbol\n",
|
||
|
" The ABCD 2x2 matrix describing the optical system.\n",
|
||
|
" \n",
|
||
|
" Returns\n",
|
||
|
" -------\n",
|
||
|
" R : float, int, symbol\n",
|
||
|
" Radius of curvature of the wavefront in meters.\n",
|
||
|
" w : float, int, symbol\n",
|
||
|
" Radius of the beam in meters.\n",
|
||
|
" \n",
|
||
|
" ray(y, theta)\n",
|
||
|
" Parameters\n",
|
||
|
" ----------\n",
|
||
|
" y : float or integer or sympy symbol in meters\n",
|
||
|
" The vertical height of a ray.\n",
|
||
|
" theta : float or integer in radians\n",
|
||
|
" The angle of divergence of the ray.\n",
|
||
|
" \n",
|
||
|
" Returns\n",
|
||
|
" -------\n",
|
||
|
" mat : 2x1 matrix\n",
|
||
|
" [\n",
|
||
|
" [y],\n",
|
||
|
" [teta]\n",
|
||
|
" ]\n",
|
||
|
"\n",
|
||
|
"DATA\n",
|
||
|
" oo = oo\n",
|
||
|
"\n",
|
||
|
"FILE\n",
|
||
|
" c:\\users\\wrighta\\documents\\beamprop\\beamprop_script.py\n",
|
||
|
"\n",
|
||
|
"\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"help(bs)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Let's first see how we define a beam and how we can visualize it propagating."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### A Gaussian beam can be defined by it's (radial) waist, $w_0$, it's Rayleigh range, $z_R = \\frac{\\pi * w_0^2}{\\lambda}$, and the location of its waist, $z_0$."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 3,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"w0 = 1E-3 # 1mm beam waist\n",
|
||
|
"lam = 355E-9 # wavelength of 355 nm (UV)\n",
|
||
|
"zR = bs.Zr(w0, lam) # Rayleigh range in m\n",
|
||
|
"z0 = 0 # location of waist in m"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### We now want to define our \"optical system\" using matrices. For this first example, we will just use a free space propagation matrix, and let the beam propagate a distance $d$ which we will define using a symbol."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 4,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"d = sym.symbols('d')\n",
|
||
|
"M = bs.prop(d)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### We now use the bs script to do all the ABCD and q-parameter math, and return the waist and radius of curvature functions"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 5,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"R, w = bs.q1_inv_func(0, w0, lam, M)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 6,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"w = 0.001*(0.0127690021685256*d**2 + 1)**0.5\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"print('w = {}'.format(w))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### And as simple as that, we have a function for our waist. Let's plot it and see what it looks like"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 8,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 432x288 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {
|
||
|
"needs_background": "light"
|
||
|
},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"bs.plot(w, d, rang = np.arange(0,10))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Let's show what happens when a beam travels through a lens. We use the \"mult\" function to multiply multiple ABCD matrices together."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 12,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 432x288 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {
|
||
|
"needs_background": "light"
|
||
|
},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"w0 = 1E-3 # 1mm beam waist\n",
|
||
|
"lam = 355E-9 # wavelength of 355 nm (UV)\n",
|
||
|
"zR = bs.Zr(w0, lam) # Rayleigh range in m\n",
|
||
|
"z0 = 0 # location of waist in m\n",
|
||
|
"\n",
|
||
|
"d = sym.symbols('d')\n",
|
||
|
"M = bs.mult(bs.prop(d), bs.lens(.5), bs.prop(1))\n",
|
||
|
" \n",
|
||
|
"R, w = bs.q1_inv_func(0, w0, lam, M)\n",
|
||
|
"\n",
|
||
|
"bs.plot(w, d, rang = np.arange(0,1,.01))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Lets look at how to expand and collimate a beam with a two lens system"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 16,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"w0 = 1E-3 # 1mm beam waist\n",
|
||
|
"lam = 355E-9 # wavelength of 355 nm (UV)\n",
|
||
|
"zR = bs.Zr(w0, lam) # Rayleigh range in m\n",
|
||
|
"z0 = 0 # location of waist in m\n",
|
||
|
"\n",
|
||
|
"d1, d2, d3, f1, f2 = sym.symbols('d1 d2 d3 f1 f2')\n",
|
||
|
"\n",
|
||
|
"M = bs.mult(bs.prop(d3),bs.lens(f2),bs.prop(d2), bs.lens(f1), bs.prop(d1))\n",
|
||
|
"\n",
|
||
|
"R, w = bs.q1_inv_func(0, w0, lam, M)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### For example, lets say the beam travels 1 m before hitting the first lens, and we want the beam to be 5x w0 after coming out of the second lens. We substitute d1 for 1 meter, since the beam propagates 1 meter, and we substitute d3 for 0, since we only care about the beam size right at the second lens. This gives us a relation between f1 and d2 (the separation between the lenses)."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 23,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"f = 1.0084642216545e+15*d2*(1.12051580183833e+27*d2 - 4.41556446152598e+29*sqrt(1 - 0.000504320418227052*d2**2) + 8.88733242867719e+28)/(1.13000009595246e+42*d2**2 + 2.26000019190491e+42*d2 - 2.12276362486616e+45)\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"w = w.subs(d1,1).subs(d3,0)\n",
|
||
|
"f1_eq = sym.solve(w - 5*w0, f1)[0]\n",
|
||
|
"print('f = {}'.format(f1_eq))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"#### Suppose we wanted the distance between the lenses to be 1 meter, we could find what f1 we need."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 26,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"f1 = 0.17 m, for a lens separation of 1 meter\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"print('f1 = {:.2f} m, for a lens separation of 1 meter'.format(f1_eq.subs(d2, 1)))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Now we need to collimate the beam. Lets still assume the beam propagates 1 m, and f1 = .17 m."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"There are a couple different ways to think about collimation. One is that the beam size doesn't change over a long distance. The other is that the radius of curvature is infinite (i.e. a plane wave). Lets us the latter interpretation. Thus, we want to find the focal length f2 that makes R infinite, or that makes 1/R =0."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 41,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"f2 = 0.83, for a collimated beam, 5x the original waist, after propagating 1m to the first lens of f1 = .17m, and propagating another 1m to the second lens\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"R_coll = R.subs(d1,1).subs(d2,1).subs(f1,.17).subs(d3,0)\n",
|
||
|
"f2_coll = sym.solve(1/R_coll,f2)[0]\n",
|
||
|
"print('f2 = {:.2f}, for a collimated beam, 5x the original waist, after propagating 1m to the first lens of f1 = .17m, and propagating another 1m to the second lens'.format(f2_coll))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Lets plot the beam profile after the second lens, and see if it is collimated."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 43,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 432x288 with 1 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {
|
||
|
"needs_background": "light"
|
||
|
},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"M = bs.mult(bs.prop(d3),bs.lens(.83),bs.prop(1), bs.lens(.17), bs.prop(1))\n",
|
||
|
"\n",
|
||
|
"R, w = bs.q1_inv_func(0, w0, lam, M)\n",
|
||
|
"\n",
|
||
|
"bs.plot(w,d3)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### Looks very collimated. Lets check the beam size (to make sure its 5* w0) and check the collimation"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 46,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"beam is w = 4.90 x w0\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"expansion_factor = w.subs(d3,0)/ w0\n",
|
||
|
"print('beam is w = {:.2f} x w0'.format(expansion_factor))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 49,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"Over 10 m after second lens, beam changes by 1%\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"beam_size_change = (w.subs(d3,10) - w.subs(d3,0)) / w.subs(d3,0) * 100\n",
|
||
|
"print('Over 10 m after second lens, beam changes by {:.0f}%'.format(beam_size_change))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": []
|
||
|
}
|
||
|
],
|
||
|
"metadata": {
|
||
|
"kernelspec": {
|
||
|
"display_name": "Python 3",
|
||
|
"language": "python",
|
||
|
"name": "python3"
|
||
|
},
|
||
|
"language_info": {
|
||
|
"codemirror_mode": {
|
||
|
"name": "ipython",
|
||
|
"version": 3
|
||
|
},
|
||
|
"file_extension": ".py",
|
||
|
"mimetype": "text/x-python",
|
||
|
"name": "python",
|
||
|
"nbconvert_exporter": "python",
|
||
|
"pygments_lexer": "ipython3",
|
||
|
"version": "3.7.3"
|
||
|
}
|
||
|
},
|
||
|
"nbformat": 4,
|
||
|
"nbformat_minor": 2
|
||
|
}
|