📄 opt_refraction.htm
字号:
<HTML> <HEAD> <TITLE>/</TITLE> <META NAME="GENERATOR" CONTENT="HTML-TOOLBOX "> </HEAD> <BODY bgcolor="#FFFFF0"> <HR WIDTH="100%"></P> <CENTER><P><FONT COLOR="#000000"><FONT SIZE=+3>Cross-linked m-file</FONT></FONT></P></CENTER> <CENTER><P><FONT COLOR="#000000"><FONT SIZE=+1></FONT></FONT></P></CENTER> <CENTER><P><FONT COLOR="#000000"><FONT SIZE=+2>opt_refraction.m</FONT></FONT></P></CENTER> <CENTER><P><FONT COLOR="#000000"><FONT SIZE=+1>Located in:</FONT></FONT></P></CENTER> <CENTER><P><FONT COLOR="#000000"><FONT SIZE=+1>/home/bjorn/matlab/Optical_bench</FONT></FONT></P></CENTER> <P><HR WIDTH="100%"></P> <P><FONT COLOR="#000000"><FONT SIZE=+2>Function synopsis</FONT></FONT></P> <P><FONT COLOR="#000000"><FONT SIZE=+1> [en,refraction_loss,n_refr,phase_shift] = opt_refraction(r_int,ray,optelem) </FONT></FONT></P> <P><HR WIDTH="100%"></P> <P><FONT COLOR="#000000"><FONT SIZE=+2>Function comments</FONT></FONT></P> <pre> % % OPT_REFRACTION - calculation of optical refraction - Snells law. % In addition it calculates the fraction of light lost in % reflection. % % See also OPT_INTERSECTION, OPT_TRACE </pre> <P><HR WIDTH="100%"></P> <P><FONT COLOR="#000000"><FONT SIZE=+1>m-files called by opt_refraction.m</FONT></FONT></P> <UL> <LI><A HREF ="opt_refrindx.htm">opt_refrindx</A></LI> <LI><A HREF ="opt_rot.htm">opt_rot</A></LI> </UL> <P><HR WIDTH="100%"></P> <P><FONT COLOR="#000000"><FONT SIZE=+1>m-files that call opt_refraction.m</FONT></FONT></P> <UL> <LI><A HREF ="Contents.htm">Contents</A></LI> <LI><A HREF ="opt_trace.htm">opt_trace</A></LI> </UL> <P><HR WIDTH="100%"></P> <P><FONT COLOR="#000000"><FONT SIZE=+1>All the cross references in the source m-code of opt_refraction.m</FONT></FONT></P> <pre> function [en,refraction_loss,n_refr,phase_shift] = opt_refraction(r_int,ray,optelem) % [en,refraction_loss,n_refr,phase_shift] = opt_refraction(r_int,ray,optelem) % % OPT_REFRACTION - calculation of optical refraction - Snells law. % In addition it calculates the fraction of light lost in % reflection. % % See also OPT_INTERSECTION, OPT_TRACE % Version: 1.0 % Copyright: Bjorn Gustavsson 20020430 n_refr = 1; en = ray.e; refraction_loss = 0; phase_shift = 0; fi_out = []; switch optelem.type case 'aperture' r_int = r_int+ ray.e*( ( dot(optelem.r,optelem.n) - dot(r_int,optelem.n) ) / dot(ray.e,optelem.n) ); dr = r_int-optelem.r; % when falling outside the aperture opening take it away! if norm(dr)>optelem.diameter/2 en = 0*en; refraction_loss = 1; end case 'grid' r_int = r_int+ ( ( dot(optelem.r,optelem.n) - ... dot(r_int,optelem.n) ) / ... dot(ray.e,optelem.n) ); m = 0; n_vec = optelem.n; n_vec = n_vec*sign(n_vec(1)); theta_in = asin(norm(cross(ray.e,n_vec))); theta_out = []; % Split the input ray to the main maximas. while ( abs( sin(theta_in) - m*ray.wavelength*1000*optelem.lpmm ) < 1 ) theta_out = [theta_out,asin( sin(theta_in) - m*ray.wavelength*(1000*optelem.lpmm) )]; m = m+1; end m = -1; % in both directions! while ( abs( sin(theta_in) - m*ray.wavelength*1000*optelem.lpmm ) < 1 ) theta_out = [theta_out,asin( sin(theta_in) - m*ray.wavelength*1000*optelem.lpmm)]; m = m-1; end en = []; for i = 1:length(theta_out) dfi = theta_in-theta_out(i); en = [en;<A HREF ="opt_rot.htm">opt_rot</A>(ray.e,optelem.e_slits,dfi)]; refractin_loss = 0; end case 'lens' coc = optelem.r+optelem.n*optelem.r_o_curv; r = r_int-coc; n_vec = r/norm(r); n_vec = n_vec*sign(n_vec(1)); fi_in = asin(norm(cross(ray.e,n_vec))); n_refr = <A HREF ="opt_refrindx.htm">opt_refrindx</A>(optelem.glass,ray.wavelength); if ray.n/n_refr*sin(fi_in) < 1 fi_in; fi_out = asin(ray.n/n_refr*sin(fi_in)); dfi = fi_in-fi_out; if norm(cross(ray.e,n_vec)) en = <A HREF ="opt_rot.htm">opt_rot</A>(ray.e,cross(ray.e,n_vec),dfi); end end if ~isempty(fi_out) if fi_in+fi_out ~= 0 % reflexion losses after refraction refraction_loss = (sin(dfi)^2/sin(fi_in+fi_out)^2+tan(dfi)^2/tan(fi_in+fi_out)^2)/2; else % and after normal incidence refraction_loss = (n_refr - ray.n).^2./(n_refr + ray.n).^2; end else % total relection en = 0*en; refraction_loss = 1; end dr = r_int-optelem.r; % when falling outside the lens opening take it away! if norm(dr)>optelem.diameter/2 en = 0*en; refraction_loss = 1; end case 'prism' r_int = r_int+ ray.e*( ( dot(optelem.r,optelem.n) - ... dot(r_int,optelem.n) ) / ... dot(ray.e,optelem.n) ); n_vec = optelem.n; n_vec = n_vec*sign(n_vec(1)); fi_in = asin(norm(cross(ray.e,n_vec))); n_refr = <A HREF ="opt_refrindx.htm">opt_refrindx</A>(optelem.glass,ray.wavelength); if ray.n/n_refr*sin(fi_in) < 1 fi_out = asin(ray.n/n_refr*sin(fi_in)); dfi = fi_in-fi_out; en = ray.e; if norm(cross(ray.e,n_vec)) en = <A HREF ="opt_rot.htm">opt_rot</A>(ray.e,cross(ray.e,n_vec),dfi); end end if ~isempty(fi_out) if fi_in+fi_out ~= 0 % reflexion losses after refraction refraction_loss = (sin(dfi)^2/sin(fi_in+fi_out)^2+tan(dfi)^2/tan(fi_in+fi_out)^2)/2; else % and after normal incidence refraction_loss = (n_refr - ray.n).^2./(n_refr + ray.n).^2; end else % total relection en = 0*en; refraction_loss = 1; end case 'screen' r_int = r_int+ ray.e*( ( dot(optelem.r,optelem.n) - dot(r_int,optelem.n) ) / dot(ray.e,optelem.n) ); if ( r_int(2) < optelem.r(2)-optelem.dxdydz(2)/2 | ... r_int(2) > optelem.r(2)+optelem.dxdydz(2)/2 | ... r_int(3) < optelem.r(3)-optelem.dxdydz(3)/2 | ... r_int(3) > optelem.r(3)+optelem.dxdydz(3)/2 ) en = ray.e; refraction_loss = 0; else en = ray.e; refraction_loss = 1; end case 'slit' r_int = r_int+ ray.e*( ( dot(optelem.r,optelem.n) - dot(r_int,optelem.n) ) / dot(ray.e,optelem.n) ); if ( r_int(2) < optelem.r(2)-optelem.dxdydz(2)/2 | ... r_int(2) > optelem.r(2)+optelem.dxdydz(2)/2 | ... r_int(3) < optelem.r(3)-optelem.dxdydz(3)/2 | ... r_int(3) > optelem.r(3)+optelem.dxdydz(3)/2 ) en = ray.e; refraction_loss = 0; else en = 0*ray.e; refraction_loss = 1; end otherwise %fh = inline([optelem.type,'(r_int,s_or_n,arglist)'],'r_int','s_or_n','arglist'); n_vec = optelem.fcn2(r_int,'n',optelem.arglist); fi_in = asin(norm(cross(ray.e,n_vec))); n_refr = <A HREF ="opt_refrindx.htm">opt_refrindx</A>(optelem.glass,ray.wavelength); if ray.n/n_refr*sin(fi_in) < 1 fi_in; fi_out = asin(ray.n/n_refr*sin(fi_in)); dfi = fi_in-fi_out; if norm(cross(ray.e,n_vec)) en = <A HREF ="opt_rot.htm">opt_rot</A>(ray.e,cross(ray.e,n_vec),dfi); end end if ~isempty(fi_out) if fi_in+fi_out ~= 0 % reflexion losses after refraction refraction_loss = (sin(dfi)^2/sin(fi_in+fi_out)^2+tan(dfi)^2/tan(fi_in+fi_out)^2)/2; else % and after normal incidence refraction_loss = (n_refr - ray.n).^2./(n_refr + ray.n).^2; end else % total relection en = 0*en; refraction_loss = 1; end end </pre> <P><HR WIDTH="100%"></P> <P><I><FONT COLOR="#0000FF"><FONT SIZE=+1>Written by B. Gustavsson 13:27 29/1 2003 <IMG SRC = "file:/home/bjorn/matlab/Local/Tools/htmltool/gifs/copyright.gif" ></FONT></FONT></I></P> <P><I><FONT COLOR="#0000FF"><FONT SIZE=+1>E-mail:</B><A HREF = "mailto:bjorn@irf.se">bjorn@irf.se</A></H4></FONT></FONT></I></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -