Complex Fresnel Calculations The complex Fresnel calculations employed in the SPR thickness measurements are given in the form of a macro for the software program IGOR PRO (Wavemetric's, Inc.). The calculations closely follow those published in the article by Wilford Hansen, J. Opt. Soc. Am. 1968, 58, 380-390. Although the equations follow Hansen's N-phase method, this particular macro is written to perform only a 4-phase calculation, which typically involves the phases: glass, gold, thin film, and then air or water. The results of these complex Fresnel calculations are plots of the percent reflectivity of p-polarized light (pRp) versus the angle of incidence (angle). For those not familiar with the program IGOR PRO, it calls a list of data points a "wave," and a variable is clearly just a single value. Mathematical operations are carried out on these waves just as on a spreadsheet column, for example. Many of the waves in these calculations are complex (i.e. comprised of a list of complex numbers). In order to relate these macros with the Hansen paper, note the following alterations: c is equivalent to x, b is equivalent to b, e is equivalent to e, (the dielectric constant) d is equivalent to h, (the layer thickness) m is equivalent to M, (the symbol used to denote a matrix) pRp is equivalent to R||, (the reflectivity of transverse magnetic or p-polarized light) A number from 1-4, following d, n, e, c, b, q, or m, is equivalent to the subscript j in the Hansen paper which refers to the particular phase or layer involved. q, n (the index of refraction), and r (the reflectance) are as defined in the Hansen paper. The waves z, ct, and ct2 are intermediate waves used only in this macro and not in the Hansen paper. With these changes defined, one should be able to understand the complex Fresnel calculations by referring to the explanations given in the Hansen paper. In addition, the Hansen paper presents much more complete Fresnel calculations, and so these macros can be modified to obtain other information. For example, phase shifts and electric field strengths can be calculated along with the reflectivity. Furthermore, these macros are easily altered for systems of 5 or more phases and also could be used for calculations relating to transverse electric (s-polarized) radiation. The Macros for IGOR PRO Macro Setitup() | Makes waves and variables--not global and so | cannot run this macro. Must copy onto command line Make/N=2000 angle,rad,pRp,prp1, z1,z2 Make/N=2000/C r,c1,c2,c3,c4,q1,q2,q3,q4,b2,b3,ct,ct2 Make/N=2000/C m2n11, m2n12,m2n21,m2n22,m3n11,m3n12,m3n21,m3n22 Make/N=2000/C m11,m12,m21,m22 Variable d2,d3,lambda Variable /C n1,n2,n3,n4,e1,e2,e3,e4 DefaultFont/U "Helvetica" EndMacro Macro Angl() | Sets up range of incident angles for the calculation angle = 8*x/2000 | 8 gives range of angles; 2000 is number of points angle = angle + 40 | 40 is the start of the range of angles rad = angle*pi/180 | Converts angle in degrees to radians EndMacro Macro Film() | Assigns layer thicknesses and wavelength in d2 = 475 d3 = 0 lambda = 6328 EndMacro Macro Di() | Assign complex indices of refraction, n; calculate n1 = cmplx(1.515,0) | the dielectric constants, e e1 = n1*n1 n2 = cmplx(0.154,3.55) e2 = n2*n2 n3 = cmplx(1.45,0) e3 = n3*n3 n4 = cmplx(1,0) e4 = n4*n4 EndMacro Macro Xi() | Use e to calculate values of xi (called c here) c1 = n1*cmplx(cos(rad),0) c2 = e1*cmplx(sin(rad)^2,0) c2 = e2 - c2 ct = r2polar(c2) | 3 lines to get square root of the ct2 = cmplx(sqrt(real(ct)), abs(imag(ct)/2)) | complex wave by going to c2= p2rect(ct2) | polar coordinates c3 = e1*cmplx(sin(rad)^2,0) c3 = e3 - c3 ct = r2polar(c3) | ct and ct2 just temporary waves ct2 = cmplx(sqrt(real(ct)),abs(imag(ct)/2)) | in the square root calc c3 = p2rect(ct2) c4 = e1*cmplx(sin(rad)^2,0) c4 = e4 - c4 ct = r2polar(c4) ct2 = cmplx(sqrt(real(ct)),abs(imag(ct)/2)) c4 = p2rect(ct2) EndMacro Macro Reflec() | reflectivity calc of p-polarized light b2 = cmplx(2*pi*d2/lambda,0) b2 = b2*c2 | calc of the beta values (called b here) b3 = cmplx(2*pi*d3/lambda,0) b3 = b3*c3 q1 = c1/e1 | calc of q values q2 = c2/e2 q3 = c3/e3 q4 = c4/e4 z1 = cos(real(b2))*cosh(imag(b2)) | calc real part of the cosine of b2 z2 = -sin(real(b2))*sinh(imag(b2)) | calc imag part of the cosine of b2 m2n11 = cmplx(z1,z2) | the 1,1 element of matrix M2 m2n22 = m2n11 | the 2,2 element is the same z1 = sin(real(b2))*cosh(imag(b2)) | calc real part of the sine of b2 z2 = cos(real(b2))*sinh(imag(b2)) | calc imag part of the sine of b2 m2n12 = cmplx(0,-1)*cmplx(z1,z2)/q2 | calc 1,2 element of matrix M2 m2n21 = cmplx(0,-1)*cmplx(z1,z2)*q2 | calc 2,1 element of matrix M2 z1 = cos(real(b3))*cosh(imag(b3)) | z2 = -sin(real(b3))*sinh(imag(b3)) | m3n11 = cmplx(z1,z2) | m3n22 = m3n11 | same as above z1 = sin(real(b3))*cosh(imag(b3)) | but now for matrix M3 z2 = cos(real(b3))*sinh(imag(b3)) | m3n12 = cmplx(0,-1)*cmplx(z1,z2)/q3 | m3n21 = cmplx(0,-1)*cmplx(z1,z2)*q3 | m11 = m2n11*m3n11 + m2n12*m3n21 | m12 = m2n11*m3n12 + m2n12*m3n22 | M2 * M3 = M m21 = m2n21*m3n11 + m2n22*m3n21 | m22 = m2n21*m3n12 + m2n22*m3n22 | ct = (m11 + m12*q4)*q1 | ct and ct2 are temporary waves ct2 = m21 + m22*q4 | used to calc reflectance, r r = (ct - ct2)/(ct + ct2) | prp = magsqr(r) * 100 | calc % reflectivity of p-polarized light EndMacro Macro FindMin() | find the SPR angle (minimum %R) Variable MinAng WaveStats pRp1 MinAng = (8*V_minloc/2000) + 40 Print MinAng Print prp1(V_minloc - 1) Print prp1(V_minloc) Print prp1(V_minloc + 1) EndMacro Macro fr() | if change a thickness and want to recalculate film() reflec() findmin() EndMacro Macro dxr() | if change an n value and want to recalculate di() xi() reflec() EndMacro Macro kill() | kill temp waves to cut file size by 90% killwaves rad, z1,z2, r,c1,c2,c3,c4,q1,q2,q3,q4,b2,b3,ct,ct2, m2n11, m2n12 killwaves m2n21,m2n22,m3n11,m3n12,m3n21,m3n22, m11,m12,m21,m22 Endmacro Macro Remake() | just remake the waves if wish to do more calcs Make/N=2000 rad, z1,z2 Make/N=2000/C r,c1,c2,c3,c4,q1,q2,q3,q4,b2,b3,ct,ct2 Make/N=2000/C m2n11, m2n12,m2n21,m2n22,m3n11,m3n12,m3n21,m3n22 Make/N=2000/C m11,m12,m21,m22 EndMacro