diff --git a/Matlab/Forces_Ashkin_Axial.m b/Matlab/Forces_Ashkin_Axial.m new file mode 100644 index 0000000..3e1bf21 --- /dev/null +++ b/Matlab/Forces_Ashkin_Axial.m @@ -0,0 +1,112 @@ +%all distances in m +clear +close all +clc +format compact + +% These calculations are based on Ashkin's article "Forces of a single-beam +% gradient laser trap on a dielectric sphere in the ray optics regime". +% There are axial forces only + +n1 = 1.33; % index of refraction of the immersion medium +n2 = 1.6; % index of refraction of the fused silica at wavelength 523 nm +n = n2/n1; % n2/n1 +c0 = 3e8; % speed of light +NA = 1.25; % numerical aperture +th_max = asin(NA/n1); % maximum angle of incidence +f = 100.0e-3; % objective lens focus or WD +r_max = f*tan(th_max); % radius of a Gaussian beam (1:1 with input aperture condition) +Rsp = 1.0e-6; % sphere radius +P = 20.0e-3; % power of the laser + +thr = @(th) asin(n1/n2*sin(th)); % refraction angle + +%reflectivity +R = @(th,psi) (tan(th-thr(th)).^2./tan(th+thr(th)).^2).*cos(psi).^2+... + (sin(th-thr(th)).^2./sin(th+thr(th)).^2).*sin(psi).^2; + +%transparency +T = @(th,psi) 1-R(th,psi); + +% Factors +Qs = @(th, psi) 1 + R(th, psi) .* cos(2*th) - T(th,psi).^2 .* (cos(2*th -... + 2*thr(th)) + R(th, psi) .* cos(2*th)) ./ (1 + R(th,psi).^2 +... + 2*R(th,psi) .* cos(2*thr(th))); + +Qg = @(th, psi) R(th, psi) .* sin(2*th) - T(th,psi).^2 .* (sin(2*th -... + 2*thr(th)) + R(th, psi) .* sin(2*th)) ./ (1 + R(th,psi).^2 +... + 2*R(th,psi) .* cos(2*thr(th))); + +Qmag = @(th, psi) sqrt(Qs(th, psi).^2 + Qg(th, psi).^2); + +% Average factors (circular polarization +Qs_avg = @(th) 0.5*(Qs(th, 0) + Qs(th, pi/2)); +Qg_avg = @(th) 0.5*(Qg(th, 0) + Qg(th, pi/2)); +Qmag_avg = @(th) sqrt(Qs_avg(th).^2 + Qg_avg(th).^2); + +% Angles +phi = @(r) atan(r/f); +thi = @(r,z) asin(z/Rsp.*sin(phi(r))); + +Qgz = @(r,z) -Qg_avg(thi(r,z)).*sin(phi(r)); +Qsz = @(r,z) Qs_avg(thi(r,z)).*cos(phi(r)); + +% Intensity profile +a = 1.0; +w0 = a*r_max; + +%I = @(r) P/(pi*r_max^2); % uniform distribution + +A = (1-exp(-2*r_max.^2/w0^2)); +I0 = P*2/(pi*w0^2)/A; +I = @(r) I0*exp(-2*r.^2/w0^2); % Gaussian TEM00 beam + +%A = 2*pi*integral(@(r) r.*besselj(0,2.405/w0*r).^2,0,r_max)/P0; +%w0_bb = 0.5*r_max; +%I0 = P*2/(pi*w0^2); +%I = @(r) I0*besselj(0,2.405/w0_bb*r).^2.*exp(-2*r.^2/w0^2); % Bessel beam + +% Intensity profile graphics +rho = linspace(-r_max, r_max, 500); +figure +plot(rho, I(rho)/max(I(rho)),'k') +grid +xlabel('r, ì') +ylabel('I(r)') +sdf('my') + +% Integration +Qres_g = @(z) 1/(pi*r_max^2)*2/(A*pi*w0^2)*integral2(@(beta,r) r.*I(r).*... + iscomplex(Qgz(r,z)),0,2*pi,0,r_max,... + 'Method','iterated','AbsTol',1e-12,'RelTol',1e-6); + +Qres_s = @(z) 1/(pi*r_max^2)*2/(A*pi*w0^2)*integral2(@(beta,r) r.*I(r).*... + iscomplex(Qsz(r,z)),0,2*pi,0,r_max,... + 'Method','iterated','AbsTol',1e-12,'RelTol',1e-6); + +% Calulation +N = 200; +z = linspace(-2*Rsp,2*Rsp,N); +Axial_g = zeros(1,N); +Axial_s = zeros(1,N); + +for ii = 1:N + Axial_g(ii) = Qres_g(z(ii)); + Axial_s(ii) = Qres_s(z(ii)); +end + +F0 = n1*P/c0; % net force + +Axial_g = fliplr(Axial_g); +Axial_s = fliplr(Axial_s); +Axial = Axial_g + Axial_s; +z = -fliplr(z); + +%Graphics +figure +plot(z,F0*Axial_g,'b-.',z,F0*Axial_s,'r--',z,F0*Axial,'k') +legend('F_{g}','F_{s}','F_{t}') +xlabel('r, ì') +ylabel('F, Í') +grid +sdf('my') \ No newline at end of file diff --git a/Matlab/Forces_Ashkin_Ray_Efficiencies.m b/Matlab/Forces_Ashkin_Ray_Efficiencies.m new file mode 100644 index 0000000..58300c5 --- /dev/null +++ b/Matlab/Forces_Ashkin_Ray_Efficiencies.m @@ -0,0 +1,48 @@ +close all +clear +format compact +clc + +% These calculations are based on Ashkin's article "Forces of a single-beam +% gradient laser trap on a dielectric sphere in the ray optics regime + +%all distances in mm +a = 1.0e-6; % radius of the bead +n1 = 1.0; % index of rafraction of the medium +n = 1.4607; % n2/n1 +n2 = n*n1; % index of refraction of the fused silica +c0 = 3e8; % speed of light + +%reflectivity +R = @(th,psi) (tan(th-asin(n1/n2*sin(th))).^2./... + tan(th+asin(n1/n2*sin(th))).^2).*cos(psi).^2+... + (sin(th-asin(n1/n2*sin(th))).^2./... + sin(th+asin(n1/n2*sin(th))).^2).*sin(psi).^2; + +%transparency +T = @(th,psi) 1-R(th,psi); + +r = @(th) asin(n1/n2*sin(th)); + +% Factors +Qs = @(th, psi) 1 + R(th, psi) .* cos(2*th) - T(th,psi).^2 .* (cos(2*th -... + 2*r(th)) + R(th, psi) .* cos(2*th)) ./ (1 + R(th,psi).^2 +... + 2*R(th,psi) .* cos(2*r(th))); + +Qg = @(th, psi) R(th, psi) .* sin(2*th) - T(th,psi).^2 .* (sin(2*th -... + 2*r(th)) + R(th, psi) .* sin(2*th)) ./ (1 + R(th,psi).^2 +... + 2*R(th,psi) .* cos(2*r(th))); + +Qmag = @(th, psi) sqrt(Qs(th, psi).^2 + Qg(th, psi).^2); + +t = linspace(0, pi/2, 1000); +t_deg = t*180/pi; +pol = pi/4; + +figure +plot(t_deg, Qs(t, pol),'r--', t_deg, -Qg(t, pol),'b-.', t_deg, Qmag(t, pol),'k'); +grid +xlabel('\theta, deg') +ylabel('Q') +legend('Q_s','Q_g','Q_t','location','northwest') +sdf('my') \ No newline at end of file diff --git a/Matlab/Forces_Ashkin_Transverse.m b/Matlab/Forces_Ashkin_Transverse.m new file mode 100644 index 0000000..d5ac37b --- /dev/null +++ b/Matlab/Forces_Ashkin_Transverse.m @@ -0,0 +1,106 @@ +%all distances in m +close all +clear +clc +format compact + +% These calculations are based on Ashkin's article "Forces of a single-beam +% gradient laser trap on a dielectric sphere in the ray optics regime". +% There are transverse forces only + +n1 = 1.33; % index of refraction of the immersion medium +n2 = 1.6; % index of refraction of the fused silica at wavelength 523 nm +n = n2/n1; % n2/n1 +c0 = 3e8; % speed of light +NA = 1.25; % numerical aperture +th_max = asin(NA/n1); % maximum angle of incidence +f = 100.0e-3; % objective lens focus or WD +r_max = f*tan(th_max); % radius of a Gaussian beam (1:1 with input aperture condition) +Rsp = 1.0e-6; % sphere radius +P = 20.0e-3; % power of the laser + +thr = @(th) asin(n1/n2*sin(th)); % refraction angle + +%reflectivity +R = @(th,psi) (tan(th-thr(th)).^2./tan(th+thr(th)).^2).*cos(psi).^2+... + (sin(th-thr(th)).^2./sin(th+thr(th)).^2).*sin(psi).^2; + +%transparency +T = @(th,psi) 1-R(th,psi); + +% Factors +Qs = @(th, psi) 1 + R(th, psi) .* cos(2*th) - T(th,psi).^2 .* (cos(2*th -... + 2*thr(th)) + R(th, psi) .* cos(2*th)) ./ (1 + R(th,psi).^2 +... + 2*R(th,psi) .* cos(2*thr(th))); + +Qg = @(th, psi) R(th, psi) .* sin(2*th) - T(th,psi).^2 .* (sin(2*th -... + 2*thr(th)) + R(th, psi) .* sin(2*th)) ./ (1 + R(th,psi).^2 +... + 2*R(th,psi) .* cos(2*thr(th))); + +% Average factors (circular polarization +Qs_avg = @(th) 0.5*(Qs(th, 0) + Qs(th, pi/2)); +Qg_avg = @(th) 0.5*(Qg(th, 0) + Qg(th, pi/2)); + +% Angles +phi = @(r) atan(r/f); +gamma = @(beta,r) acos(cos(pi/2-phi(r)).*cos(beta)); +thi = @(beta,r,y) asin(y/Rsp.*sin(gamma(beta,r))); + +Qgy = @(beta,r,y) Qg_avg(thi(beta,r,y)).*cos(phi(r)); +Qsy = @(beta,r,y) Qs_avg(thi(beta,r,y)).*sin(gamma(beta,r)); + +% Intensity profile +a = 1.0; +w0 = a*r_max; + +%I = @(r) P/(pi*r_max^2); % uniform distribution + +A = (1-exp(-2*r_max.^2/w0^2)); +I0 = 2*P/(pi*w0^2)*A; +I = @(r) I0*exp(-2*r.^2/w0^2); % Gaussian TEM00 beam + +%P0 = exp(0.5)*w0*0.0025/4.81; +%A = 2*pi*integral(@(r) r.*besselj(0,2.405/w0*r).^2,0,r_max)/P0; +%I = @(r) 1/(A*P0)*besselj(0,2.405/w0*r).^2; % Bessel beam + +% Intensity profile graphics +rho = linspace(-r_max, r_max, 500); +figure +plot(rho, I(rho)/max(I(rho)),'k') +grid +xlabel('r, m') +ylabel('I(r)') +sdf('my') + +% Integration +Qres_g = @(y) 1/(pi*r_max^2)*integral2(@(beta,r) r.*I(r).*... + iscomplex(Qgy(beta,r,y)),0,2*pi,0,r_max,... + 'Method','iterated','AbsTol',1e-6,'RelTol',1e-6); + +Qres_s = @(y) 1/(pi*r_max^2)*integral2(@(beta,r) r.*I(r).*... + iscomplex(Qsy(beta,r,y)),0,2*pi,0,r_max,... + 'Method','iterated','AbsTol',1e-6,'RelTol',1e-6); + +% Calulation +N = 150; +y = linspace(-2*Rsp,2*Rsp,N); +Transverse_g = zeros(1,N); +Transverse_s = zeros(1,N); + +for ii = 1:N + Transverse_g(ii) = abs(Qres_g(y(ii))); + Transverse_s(ii) = Qres_s(y(ii)); +end + +Transverse = abs(Transverse_g) + Transverse_s; + +F0 = n1*P/c0; % net force; + +%Graphics +figure +plot(y,F0*Transverse_g,'r--',y,F0*Transverse_s,'b-.',y,F0*Transverse,'k') +legend('F_{g}','F_{s}','F_{t}') +xlabel('r, ì') +ylabel('F, Í') +grid +sdf('my') diff --git a/Matlab/iscomplex.m b/Matlab/iscomplex.m new file mode 100644 index 0000000..152359f --- /dev/null +++ b/Matlab/iscomplex.m @@ -0,0 +1,11 @@ +function S = iscomplex(A) +[n,m] = size(A); +S = zeros(n,m); + +for ii = 1:n + for jj = 1:m + S(ii,jj) = A(ii,jj)*double(isreal(A(ii,jj))); + end +end + +end \ No newline at end of file diff --git a/Matlab/sdf.m b/Matlab/sdf.m new file mode 100644 index 0000000..d7ada13 --- /dev/null +++ b/Matlab/sdf.m @@ -0,0 +1,85 @@ +function sdf(varargin) +% SDF Set the line width and fonts of a figure +% +% sdf(fig) +% +% where fig is the figure number. If the figure number is omitted, the +% currently active figure is updated. Edit the file to set you own style +% settings. +% +% sdf(fig, 'stylename') +% applies a pre-configured style from the File-->Export Setup menu of the +% figure's window. The stylename should be one of the 'Export Styles' +% section of the dialog. +% +% The function allows applying the same settings as through the +% File-->Export Setup-->Apply menu of the figure, but much faster and +% without the annoying clicking. +% +% Example +% figure(1); t=0:0.1:10; plot(t, sin(t)); +% sdf(1) +% pause +% sdf(1,'PowerPoint') + +% Andrey Popov, Hamburg, 2009 + +%% Parse the input data +default = true; +if nargin == 0 % no input - take current fig and apply default style + fig = gcf(); +else % at least 1 input + if ischar(varargin{1}) % style name + default = false; + style_name = varargin{1}; + fig = gcf(); + else + fig = varargin{1}; + figure(fig); % just in case it does not exist + if nargin == 2 + default = false; + style_name = varargin{2}; + end + end +end + +%% Apply a style +if default % Apply a default style + style = struct(); + style.Version = '1'; + style.Format = 'eps'; + style.Preview = 'none'; + style.Width = 'auto'; + style.Height = 'auto'; + style.Units = 'centimeters'; + style.Color = 'rgb'; + style.Background = 'w'; % '' = no change; 'w' = white background + style.FixedFontSize = '10'; + style.ScaledFontSize = 'auto'; + style.FontMode = 'fixed'; + style.FontSizeMin = '8'; + style.FixedLineWidth = '2'; + style.ScaledLineWidth = 'auto'; + style.LineMode = 'fixed'; + style.LineWidthMin = '0.5'; + style.FontName = 'auto'; + style.FontWeight = 'auto'; + style.FontAngle = 'auto'; + style.FontEncoding = 'latin1'; + style.PSLevel = '2'; + style.Renderer = 'auto'; + style.Resolution = 'auto'; + style.LineStyleMap = 'none'; + style.ApplyStyle = '0'; + style.Bounds = 'loose'; + style.LockAxes = 'on'; + style.ShowUI = 'on'; + style.SeparateText = 'off'; + + hgexport(fig,'temp_dummy',style,'applystyle', true); + +else % Apply an existing style, defined as in the Export dialog + % The files are in folder fullfile(prefdir(0),'ExportSetup'); + style = hgexport('readstyle',style_name); + hgexport(fig,'temp_dummy',style,'applystyle', true); +end diff --git a/Python/trap_forces_axial.py b/Python/trap_forces_axial.py new file mode 100644 index 0000000..20b0542 --- /dev/null +++ b/Python/trap_forces_axial.py @@ -0,0 +1,152 @@ +# These calculations are based on Ashkin's article "Forces of a single-beam +# gradient laser trap on a dielectric sphere in the ray optics regime". +# There are axial forces only + +import numpy as np +import matplotlib.pyplot as plt +import seaborn as sns +from scipy import integrate +from scipy import special +from scipy import constants + +n1 = 1.3337 # index of refraction of the immersion medium +n2 = 1.4607 # index of refraction of the fused silica at wavelength 523 nm +n = n2 / n1 # n2/n1 +NA = 1.25 # numerical aperture +th_max = np.arcsin(NA / n1) # maximum angle of incidence +f = 2.0e-3 # objective lens focus or WD +r_max = f * np.tan(th_max) # radius of a Gaussian beam (1:1 with input aperture condition) +Rsp = 1.03e-6 # sphere radius +P = 4.4e-3 # power of the laser + + +# angle of refraction +def r(th): + return np.arcsin(n1 / n2 * np.sin(th)) + + +# Fresnel reflectivity +def r_f(th, psi): + return (np.tan(th - r(th)) ** 2 / np.tan(th + r(th)) ** 2) * np.cos(psi) ** 2 + \ + (np.sin(th - r(th)) ** 2 / np.sin(th + r(th)) ** 2) * np.sin(psi) ** 2 + + +# Fresnel transparency +def t_f(th, psi): + return 1 - r_f(th, psi) + + +# force factors +def q_s(th, psi): + return 1 + r_f(th, psi) * np.cos(2 * th) - t_f(th, psi) ** 2 * \ + (np.cos(2 * th - 2 * r(th)) + r_f(th, psi) * np.cos(2*th)) / \ + (1 + r_f(th, psi) ** 2 + 2 * r_f(th, psi) * np.cos(2*r(th))) + + +def q_g(th, psi): + return r_f(th, psi) * np.sin(2 * th) - t_f(th, psi) ** 2 * \ + (np.sin(2 * th - 2 * r(th)) + r_f(th, psi) * np.sin(2 * th)) / \ + (1 + r_f(th, psi) ** 2 + 2 * r_f(th, psi) * np.cos(2 * r(th))) + + +def q_mag(th, psi): + return np.sqrt(q_s(th, psi) ** 2 + q_g(th, psi) ** 2) + + +# Average factors (circular polarization +def q_s_avg(th): + return 0.5 * (q_s(th, 0) + q_s(th, np.pi/2)) + + +def q_g_avg(th): + return 0.5 * (q_g(th, 0) + q_g(th, np.pi/2)) + + +def q_mag_avg(th): + return np.sqrt(q_s_avg(th) ** 2 + q_g_avg(th) ** 2) + + +# Angles +def phi(dr): + return np.arctan(dr / f) + + +def thi(dr, dz): + return np.arcsin(dz / Rsp * np.sin(phi(dr)), dtype=np.cfloat) + + +def q_g_z(dr, dz): + return -q_g_avg(thi(dr, dz)) * np.sin(phi(dr)) + + +def q_s_z(dr, dz): + return q_s_avg(thi(dr, dz)) * np.cos(phi(dr)) + + +# Intensity profile +a = 1.0 +w0 = a * r_max + + +def intensity_uniform(): + return P / (np.pi * r_max ** 2) + + +def intensity_gaussian_tem00(dr): + i_0 = P * 2 / (np.pi*w0 ** 2) + return i_0 * np.exp(-2 * dr ** 2 / w0 ** 2) + + +def intensity_bessel(dr): + w0_bb = 0.5 * r_max + i_0 = P * 2 / (np.pi * w0 ** 2) + return i_0 * special.jv(0, 2.405 / w0_bb * dr) ** 2 * np.exp(- 2 * dr ** 2 / w0 ** 2) + + +# Intensity profile graphics +sns.set() +sns.set_style("darkgrid") + +rho = np.linspace(-r_max, r_max, 500) +fig1 = plt.figure(1, figsize=(10, 6)) +plt.plot(rho, intensity_gaussian_tem00(rho), 'k') +plt.xlabel('r, m', fontsize=18) +plt.ylabel('I(r)', fontsize=18) + + +# Integration +def q_res_g(dz, func): + ans = integrate.quad(lambda x: x * func(x) * q_g_z(x, dz) * (~np.iscomplex(q_g_z(x, dz))).astype(float), + 0, r_max, epsabs=1e-12, epsrel=1e-6) + return 2 * np.pi * ans[0] + + +def q_res_s(dz, func): + ans = integrate.quad(lambda x: x * func(x) * q_s_z(x, dz) * (~np.iscomplex(q_s_z(x, dz))).astype(float), + 0, r_max, epsabs=1e-12, epsrel=1e-6) + return 2 * np.pi * ans[0] + + +# Calculation +n = 200 +z = np.linspace(-2 * Rsp, 2 * Rsp, n) + +axial_g = [q_res_g(x, intensity_gaussian_tem00) for x in z] +axial_s = [q_res_s(x, intensity_gaussian_tem00) for x in z] + +f_0 = n1 * P / constants.c # net force + +axial_g = np.array(axial_g[::-1]) +axial_s = np.array(axial_s[::-1]) +axial = axial_g + axial_s +z = -z[::-1] + +# Graphics +fig2 = plt.figure(2, figsize=(10, 6)) +plt.plot(z, f_0*axial_g, 'b-.', lw=1, label='$F_{g}$') +plt.plot(z, f_0*axial_s, 'r--', lw=1, label='$F_{s}$') +plt.plot(z, f_0*axial, 'k', lw=1, label='$F_{t}$') +plt.xlabel('r, m', fontsize=18) +plt.ylabel('F, N', fontsize=18) +plt.legend(fontsize=18) +plt.show() diff --git a/Python/trap_forces_efficiencies.py b/Python/trap_forces_efficiencies.py new file mode 100644 index 0000000..0d5d521 --- /dev/null +++ b/Python/trap_forces_efficiencies.py @@ -0,0 +1,65 @@ +# These calculations are based on Ashkin's article "Forces of a single-beam +# gradient laser trap on a dielectric sphere in the ray optics regime + +# all distances in mm + +import numpy as np +import matplotlib.pyplot as plt + + +a = 1.0 * 1e-6 # radius of the bead +n1 = 1.33 # index of refraction of the medium +n = 1.8 # n2/n1 +n2 = n * n1 # index of refraction of the fused silica +c0 = 3 * 1e8 # speed of light + + +# Fresnel reflectivity +def r_f(th, psi): + return (np.tan(th - np.arcsin(n1 / n2 * np.sin(th))) ** 2 / + np.tan(th + np.arcsin(n1 / n2 * np.sin(th))) ** 2) * np.cos(psi) ** 2 + \ + (np.sin(th - np.arcsin(n1 / n2 * np.sin(th))) ** 2 / + np.sin(th + np.arcsin(n1 / n2 * np.sin(th))) ** 2) * np.sin(psi) ** 2 + + +# Fresnel transparency +def t_f(th, psi): + return 1 - r_f(th, psi) + + +# angle of refraction +def r(th): + return np.arcsin(n1 / n2 * np.sin(th)) + + +# force factors +def q_s(th, psi): + return 1 + r_f(th, psi) * np.cos(2 * th) - t_f(th, psi) ** 2 * \ + (np.cos(2 * th - 2 * r(th)) + r_f(th, psi) * np.cos(2*th)) / \ + (1 + r_f(th, psi) ** 2 + 2 * r_f(th, psi) * np.cos(2*r(th))) + + +def q_g(th, psi): + return r_f(th, psi) * np.sin(2 * th) - t_f(th, psi) ** 2 * \ + (np.sin(2 * th - 2 * r(th)) + r_f(th, psi) * np.sin(2 * th)) / \ + (1 + r_f(th, psi) ** 2 + 2 * r_f(th, psi) * np.cos(2 * r(th))) + + +def q_mag(th, psi): + return np.sqrt(q_s(th, psi) ** 2 + q_g(th, psi) ** 2) + + +t = np.linspace(0, np.pi / 2, 1000) +t_deg = t * 180 / np.pi +pol = np.pi / 4 + +plt.figure(figsize=(13, 8)) +plt.plot(t_deg, q_s(t, pol), 'r--', label='Q_s') +plt.plot(t_deg, -q_g(t, pol), 'b-.', label='Q_g') +plt.plot(t_deg, q_mag(t, pol), 'k', label='Q_t') +plt.grid() +plt.xlabel(r'$\theta$, deg', fontsize=18) +plt.ylabel('Q', fontsize=18) +plt.legend(fontsize=18) +plt.title('Beam efficiencies', fontsize=20) +plt.show() diff --git a/Python/trap_forces_transverse.py b/Python/trap_forces_transverse.py new file mode 100644 index 0000000..9d9cae2 --- /dev/null +++ b/Python/trap_forces_transverse.py @@ -0,0 +1,158 @@ +# These calculations are based on Ashkin's article "Forces of a single-beam +# gradient laser trap on a dielectric sphere in the ray optics regime". +# There are transverse forces only + +import numpy as np +import matplotlib.pyplot as plt +from scipy import integrate +from scipy import special +from scipy import constants + +n1 = 1.3337 # index of refraction of the immersion medium +n2 = 1.4607 # index of refraction of the fused silica at wavelength 523 nm +n = n2 / n1 # n2/n1 +NA = 1.25 # numerical aperture +th_max = np.arcsin(NA / n1) # maximum angle of incidence +f = 2.0e-3 # objective lens focus or WD +r_max = f * np.tan(th_max) # radius of a Gaussian beam (1:1 with input aperture condition) +Rsp = 1.03e-6 # sphere radius +P = 14e-3 # power of the laser + + +# Angles +def r(th): + return np.arcsin(n1 / n2 * np.sin(th, dtype=np.cfloat)) + + +def phi(dr): + return np.arctan(dr / f, dtype=np.cfloat) + + +def gamma(db, dr): + return np.arccos(np.cos(np.pi / 2 - phi(dr)) * np.cos(db), dtype=np.cfloat) + + +def thi(db, dr, dy): + return np.arcsin(dy / Rsp * np.sin(gamma(db, dr)), dtype=np.cfloat) + + +# Fresnel reflectivity +def r_f(th, psi): + return (np.tan(th - r(th)) ** 2 / np.tan(th + r(th)) ** 2) * np.cos(psi) ** 2 + \ + (np.sin(th - r(th)) ** 2 / np.sin(th + r(th)) ** 2) * np.sin(psi) ** 2 + + +# Fresnel transparency +def t_f(th, psi): + return 1 - r_f(th, psi) + + +# force factors +def q_s(th, psi): + return 1 + r_f(th, psi) * np.cos(2 * th) - t_f(th, psi) ** 2 * \ + (np.cos(2 * th - 2 * r(th)) + r_f(th, psi) * np.cos(2*th)) / \ + (1 + r_f(th, psi) ** 2 + 2 * r_f(th, psi) * np.cos(2*r(th))) + + +def q_g(th, psi): + return r_f(th, psi) * np.sin(2 * th) - t_f(th, psi) ** 2 * \ + (np.sin(2 * th - 2 * r(th)) + r_f(th, psi) * np.sin(2 * th)) / \ + (1 + r_f(th, psi) ** 2 + 2 * r_f(th, psi) * np.cos(2 * r(th))) + + +def q_mag(th, psi): + return np.sqrt(q_s(th, psi) ** 2 + q_g(th, psi) ** 2) + + +# Average factors (circular polarization) +def q_s_avg(th): + return 0.5 * (q_s(th, 0) + q_s(th, np.pi/2)) + + +def q_g_avg(th): + return 0.5 * (q_g(th, 0) + q_g(th, np.pi/2)) + + +def q_mag_avg(th): + return np.sqrt(q_s_avg(th) ** 2 + q_g_avg(th) ** 2) + + +def q_g_z(db, dr, dy): + return q_g_avg(thi(db, dr, dy)) * np.cos(phi(dr), dtype=np.cfloat) + + +def q_s_z(db, dr, dy): + return q_s_avg(thi(db, dr, dy)) * np.sin(gamma(db, dr), dtype=np.cfloat) + + +# Intensity profile +a = 1.0 +w0 = a * r_max + + +def intensity_uniform(dr): + return 1 / (np.pi * r_max ** 2) + + +def intensity_gaussian_tem00(dr): + amp = (1 - np.exp(-2 * r_max ** 2 / w0 ** 2)) + p_0 = np.pi * w0 ** 2 / 2 + return 1 / (amp * p_0) * np.exp(-2 * dr ** 2 / w0 ** 2) + + +def intensity_bessel(dr): + p_0 = np.exp(0.5) * w0 * 0.0025 / 4.81 + + def temp_f(w): + return w * special.jv(0, 2.405 / w0 * w) ** 2 + amp = integrate.quad(temp_f, 0, r_max) + return 1 / (2 * np.pi * amp[0]) * special.jv(0, 2.405 / w0 * dr) ** 2 + + +# Intensity profile graphics +rho = np.linspace(-r_max, r_max, 500) +fig1 = plt.figure(1, figsize=(10, 6)) +plt.plot(rho, intensity_gaussian_tem00(rho), 'k') +plt.grid() +plt.xlabel('r, m', fontsize=18) +plt.ylabel('I(r)', fontsize=18) +plt.show() + + +# Integration +def q_res_g(dy, func): + ans = integrate.dblquad(lambda dr, db, dy: dr * func(dr) * q_g_z(db, dr, dy) * (~np.iscomplex(q_g_z(db, dr, P))).astype(float), + 0, 2 * np.pi, 0, r_max, args=(dy, ), + epsabs=1e-4, epsrel=1e-6) + return ans[0] + + +def q_res_s(dy, func): + ans = integrate.dblquad(lambda dr, db: dr * func(dr) * q_s_z(db, dr, dy) * (~np.iscomplex(q_g_z(db, dr, P))).astype(float), + 0, 2 * np.pi, 0, r_max, + epsabs=1e-4, epsrel=1e-6) + return ans[0] + + +# Calculation +n = 150 +y = np.linspace(-2 * Rsp, 2 * Rsp, n) + +transverse_g = np.abs(np.array([q_res_g(x, intensity_gaussian_tem00) for x in y])) +transverse_s = np.array([q_res_s(x, intensity_gaussian_tem00) for x in y]) + +f_0 = n1 * P / constants.c # net force + +transverse = transverse_g + transverse_s + + +# Graphics +fig2 = plt.figure(2, figsize=(10, 6)) +plt.plot(y, transverse_g, 'b-.', lw=1, label='$F_{g}$') +plt.plot(y, transverse_s, 'r--', lw=1, label='$F_{s}$') +plt.plot(y, transverse, 'k', lw=1, label='$F_{t}$') +plt.xlabel('r, m', fontsize=18) +plt.ylabel('F, m', fontsize=18) +plt.legend() +plt.grid() +plt.show() \ No newline at end of file