/* * METRIC --- Mode expansion modeling in integrated optics / photonics * http://metric.computational-photonics.eu/ */ /* * media.h * Optical properties for a few common media in integrated photonics, * emphasis on wavelength dependence, material dispersion */ #include #include #include #include"inout.h" #include"complex.h" #include"matrix.h" #include"structure.h" #include"gengwed.h" #include"media.h" /* error message */ void mediaerror(const char *msg) { fprintf(stderr, "\nmedia: %s.\n", msg); exit(1); } /* ---------------------------------------------------------------------- */ // default wavelength range (applies to vaccum only) #define MEDIA_SMALLWAVELENGTH 1.0e-15 // default wavelength range #define MEDIA_LARGEWAVELENGTH 1.0e100 // refactive index, permittivity: // return real values, if imaginary parts (where available) are below this limit #define MEDIA_Nim_NEGLECT 1.0e-4 /* ------------------------------------------------------------------------ * dipersion equations, helper routines * ------------------------------------------------------------------------ */ /* C.M. Herzinger, B. Johs, W.A. McGahan, J.A. Woollam, and W. Paulson Ellipsometric determination of optical constants for silicon and thermally grown silicon dioxide via a multi-sample, multi-wavelength, multi-angle investigation, Journal of Applied Physics 83(6), 3323-3336, 1998 (data as provided online as supplementary material) */ /* Si, complex permitivity at wavelength l (micrometer) */ double eV0_Si_HJM = 6.6; double eV1_Si_HJM = 0.2; Complex eps_Si_HJM(double l) { double DeV[636] = {6.60, 6.58, 6.56, 6.54, 6.52, 6.50, 6.49, 6.48, 6.47, 6.46, 6.45, 6.44, 6.43, 6.42, 6.41, 6.40, 6.39, 6.38, 6.37, 6.36, 6.35, 6.34, 6.33, 6.32, 6.31, 6.30, 6.29, 6.28, 6.27, 6.26, 6.25, 6.24, 6.23, 6.22, 6.21, 6.20, 6.19, 6.18, 6.17, 6.16, 6.15, 6.14, 6.13, 6.12, 6.11, 6.10, 6.09, 6.08, 6.07, 6.06, 6.05, 6.04, 6.03, 6.02, 6.01, 6.00, 5.99, 5.98, 5.97, 5.96, 5.95, 5.94, 5.93, 5.92, 5.91, 5.90, 5.89, 5.88, 5.87, 5.86, 5.85, 5.84, 5.83, 5.82, 5.81, 5.80, 5.79, 5.78, 5.77, 5.76, 5.75, 5.74, 5.73, 5.72, 5.71, 5.70, 5.69, 5.68, 5.67, 5.66, 5.65, 5.64, 5.63, 5.62, 5.61, 5.60, 5.59, 5.58, 5.57, 5.56, 5.55, 5.54, 5.53, 5.52, 5.51, 5.50, 5.49, 5.48, 5.47, 5.46, 5.45, 5.44, 5.43, 5.42, 5.41, 5.40, 5.39, 5.38, 5.37, 5.36, 5.35, 5.34, 5.33, 5.32, 5.31, 5.30, 5.29, 5.28, 5.27, 5.26, 5.25, 5.24, 5.23, 5.22, 5.21, 5.20, 5.19, 5.18, 5.17, 5.16, 5.15, 5.14, 5.13, 5.12, 5.11, 5.10, 5.09, 5.08, 5.07, 5.06, 5.05, 5.04, 5.03, 5.02, 5.01, 5.00, 4.99, 4.98, 4.97, 4.96, 4.95, 4.94, 4.93, 4.92, 4.91, 4.90, 4.89, 4.88, 4.87, 4.86, 4.85, 4.84, 4.83, 4.82, 4.81, 4.80, 4.79, 4.78, 4.77, 4.76, 4.75, 4.74, 4.73, 4.72, 4.71, 4.70, 4.69, 4.68, 4.67, 4.66, 4.65, 4.64, 4.63, 4.62, 4.61, 4.60, 4.59, 4.58, 4.57, 4.56, 4.55, 4.54, 4.53, 4.52, 4.51, 4.50, 4.49, 4.48, 4.47, 4.46, 4.45, 4.44, 4.43, 4.42, 4.41, 4.40, 4.39, 4.38, 4.37, 4.36, 4.35, 4.34, 4.33, 4.32, 4.31, 4.30, 4.29, 4.28, 4.27, 4.26, 4.25, 4.24, 4.23, 4.22, 4.21, 4.20, 4.19, 4.18, 4.17, 4.16, 4.15, 4.14, 4.13, 4.12, 4.11, 4.10, 4.09, 4.08, 4.07, 4.06, 4.05, 4.04, 4.03, 4.02, 4.01, 4.00, 3.99, 3.98, 3.97, 3.96, 3.95, 3.94, 3.93, 3.92, 3.91, 3.90, 3.89, 3.88, 3.87, 3.86, 3.85, 3.84, 3.83, 3.82, 3.81, 3.80, 3.79, 3.78, 3.77, 3.76, 3.75, 3.74, 3.73, 3.72, 3.71, 3.70, 3.69, 3.68, 3.67, 3.66, 3.65, 3.64, 3.63, 3.62, 3.61, 3.60, 3.59, 3.58, 3.57, 3.56, 3.55, 3.54, 3.53, 3.52, 3.51, 3.50, 3.49, 3.48, 3.47, 3.46, 3.45, 3.44, 3.43, 3.42, 3.41, 3.40, 3.39, 3.38, 3.37, 3.36, 3.35, 3.34, 3.33, 3.32, 3.31, 3.30, 3.29, 3.28, 3.27, 3.26, 3.25, 3.24, 3.23, 3.22, 3.21, 3.20, 3.19, 3.18, 3.17, 3.16, 3.15, 3.14, 3.13, 3.12, 3.11, 3.10, 3.09, 3.08, 3.07, 3.06, 3.05, 3.04, 3.03, 3.02, 3.01, 3.00, 2.99, 2.98, 2.97, 2.96, 2.95, 2.94, 2.93, 2.92, 2.91, 2.90, 2.89, 2.88, 2.87, 2.86, 2.85, 2.84, 2.83, 2.82, 2.81, 2.80, 2.79, 2.78, 2.77, 2.76, 2.75, 2.74, 2.73, 2.72, 2.71, 2.70, 2.69, 2.68, 2.67, 2.66, 2.65, 2.64, 2.63, 2.62, 2.61, 2.60, 2.59, 2.58, 2.57, 2.56, 2.55, 2.54, 2.53, 2.52, 2.51, 2.50, 2.49, 2.48, 2.47, 2.46, 2.45, 2.44, 2.43, 2.42, 2.41, 2.40, 2.39, 2.38, 2.37, 2.36, 2.35, 2.34, 2.33, 2.32, 2.31, 2.30, 2.29, 2.28, 2.27, 2.26, 2.25, 2.24, 2.23, 2.22, 2.21, 2.20, 2.19, 2.18, 2.17, 2.16, 2.15, 2.14, 2.13, 2.12, 2.11, 2.10, 2.09, 2.08, 2.07, 2.06, 2.05, 2.04, 2.03, 2.02, 2.01, 2.00, 1.99, 1.98, 1.97, 1.96, 1.95, 1.94, 1.93, 1.92, 1.91, 1.90, 1.89, 1.88, 1.87, 1.86, 1.85, 1.84, 1.83, 1.82, 1.81, 1.80, 1.79, 1.78, 1.77, 1.76, 1.75, 1.74, 1.73, 1.72, 1.71, 1.70, 1.69, 1.68, 1.67, 1.66, 1.65, 1.64, 1.63, 1.62, 1.61, 1.60, 1.59, 1.58, 1.57, 1.56, 1.55, 1.54, 1.53, 1.52, 1.51, 1.50, 1.49, 1.48, 1.47, 1.46, 1.45, 1.44, 1.43, 1.42, 1.41, 1.40, 1.39, 1.38, 1.37, 1.36, 1.35, 1.34, 1.33, 1.32, 1.31, 1.30, 1.29, 1.28, 1.27, 1.26, 1.25, 1.24, 1.23, 1.22, 1.21, 1.20, 1.19, 1.18, 1.17, 1.16, 1.15, 1.14, 1.13, 1.12, 1.11, 1.10, 1.09, 1.08, 1.07, 1.06, 1.05, 1.04, 1.03, 1.02, 1.01, 1.00, 0.99, 0.98, 0.97, 0.96, 0.95, 0.94, 0.93, 0.92, 0.91, 0.90, 0.89, 0.88, 0.87, 0.86, 0.85, 0.84, 0.83, 0.82, 0.81, 0.80, 0.79, 0.78, 0.77, 0.76, 0.75, 0.74, 0.73, 0.72, 0.71, 0.70, 0.69, 0.68, 0.67, 0.66, 0.65, 0.64, 0.63, 0.62, 0.61, 0.60, 0.59, 0.58, 0.57, 0.56, 0.55, 0.54, 0.53, 0.52, 0.51, 0.50, 0.49, 0.48, 0.47, 0.46, 0.45, 0.44, 0.43, 0.42, 0.41, 0.40, 0.39, 0.38, 0.37, 0.36, 0.35, 0.34, 0.33, 0.32, 0.31, 0.30, 0.29, 0.28, 0.27, 0.26, 0.25, 0.24, 0.23, 0.22, 0.21, 0.20}; double Deps1[636] = {-6.003154, -6.041721, -6.080555, -6.119697, -6.159183, -6.199059, -6.219153, -6.239355, -6.259675, -6.280122, -6.300686, -6.321383, -6.342219, -6.363189, -6.384305, -6.405572, -6.426996, -6.448574, -6.470314, -6.492221, -6.514305, -6.536567, -6.559004, -6.581626, -6.604439, -6.627446, -6.650655, -6.674067, -6.697678, -6.721504, -6.745541, -6.769793, -6.794258, -6.818957, -6.84388, -6.869032, -6.894416, -6.920032, -6.945892, -6.971996, -6.998333, -7.024924, -7.051766, -7.078861, -7.106201, -7.133803, -7.161667, -7.18978, -7.21816, -7.246802, -7.275706, -7.304884, -7.33432, -7.364023, -7.394009, -7.424269, -7.454813, -7.485623, -7.516703, -7.548053, -7.579675, -7.61156, -7.643718, -7.676142, -7.708833, -7.741786, -7.775009, -7.808493, -7.842233, -7.876242, -7.910513, -7.945038, -7.979826, -8.01487, -8.050165, -8.085716, -8.121491, -8.157505, -8.193759, -8.230249, -8.266976, -8.303935, -8.341128, -8.378556, -8.416211, -8.4541, -8.49222, -8.530572, -8.569164, -8.608001, -8.647091, -8.68646, -8.726118, -8.766118, -8.806491, -8.847299, -8.888613, -8.930519, -8.973101, -9.01644, -9.060605, -9.105597, -9.151345, -9.197636, -9.244105, -9.290159, -9.334971, -9.377464, -9.416343, -9.450144, -9.477351, -9.496506, -9.506371, -9.506071, -9.495213, -9.473981, -9.443152, -9.404047, -9.358458, -9.308472, -9.256319, -9.204204, -9.154119, -9.107778, -9.066509, -9.031244, -9.002543, -8.980635, -8.965492, -8.9569, -8.954528, -8.95798, -8.966852, -8.980755, -8.999336, -9.022292, -9.049364, -9.080338, -9.115042, -9.153345, -9.195142, -9.240357, -9.288938, -9.340851, -9.396082, -9.454633, -9.516513, -9.581753, -9.650391, -9.722469, -9.798056, -9.877198, -9.959978, -10.04647, -10.13673, -10.23088, -10.32897, -10.4311, -10.53733, -10.64778, -10.7625, -10.88156, -11.00506, -11.13305, -11.2656, -11.40275, -11.54455, -11.69105, -11.84227, -11.99824, -12.15895, -12.32443, -12.49466, -12.66961, -12.84926, -13.03354, -13.22242, -13.4158, -13.6136, -13.8157, -14.02201, -14.23237, -14.44666, -14.6647, -14.88632, -15.11136, -15.33963, -15.57095, -15.80515, -16.04209, -16.28166, -16.52373, -16.76824, -17.01513, -17.2643, -17.51554, -17.76845, -18.02222, -18.27551, -18.52617, -18.77098, -19.00558, -19.2243, -19.42037, -19.58636, -19.71484, -19.79935, -19.83543, -19.82151, -19.75949, -19.65454, -19.51426, -19.34709, -19.1603, -18.95774, -18.73818, -18.49421, -18.21227, -17.87381, -17.45708, -16.93981, -16.30187, -15.52771, -14.60856, -13.54344, -12.33997, -11.01371, -9.587206, -8.088153, -6.547035, -4.994889, -3.460832, -1.970422, -0.5442792, 0.8024002, 2.059762, 3.222767, 4.290227, 5.264163, 6.148678, 6.949382, 7.67276, 8.325717, 8.915253, 9.448221, 9.931094, 10.36997, 10.77033, 11.13719, 11.47495, 11.78751, 12.07826, 12.35021, 12.60592, 12.84765, 13.07737, 13.2968, 13.50742, 13.71057, 13.90737, 14.09885, 14.28587, 14.46919, 14.64947, 14.82726, 15.00304, 15.17723, 15.35015, 15.52209, 15.6933, 15.86396, 16.03423, 16.20423, 16.3741, 16.54391, 16.71375, 16.88368, 17.0538, 17.22416, 17.39488, 17.56604, 17.73778, 17.91025, 18.08364, 18.25818, 18.43413, 18.61181, 18.7916, 18.97395, 19.15935, 19.3484, 19.54175, 19.74013, 19.94437, 20.1554, 20.37421, 20.602, 20.84009, 21.09008, 21.35398, 21.6344, 21.93482, 22.26, 22.61654, 23.01344, 23.46292, 23.98111, 24.58865, 25.31062, 26.17564, 27.21325, 28.44932, 29.89975, 31.56288, 33.41301, 35.39683, 37.43499, 39.43012, 41.27949, 42.89018, 44.1921, 45.14623, 45.74596, 46.01252, 45.98629, 45.71726, 45.25687, 44.6525, 43.94458, 43.16604, 42.3429, 41.49542, 40.63929, 39.78669, 38.94695, 38.12726, 37.33297, 36.56792, 35.83477, 35.1351, 34.4696, 33.83825, 33.2404, 32.67491, 32.14022, 31.63452, 31.1558, 30.70195, 30.27084, 29.86039, 29.46864, 29.09379, 28.73418, 28.38838, 28.05514, 27.73337, 27.42213, 27.12064, 26.8282, 26.54423, 26.26822, 25.9997, 25.73829, 25.48364, 25.23541, 24.99333, 24.75714, 24.52659, 24.30147, 24.08159, 23.86676, 23.65679, 23.45154, 23.25086, 23.05461, 22.86266, 22.67487, 22.49115, 22.31137, 22.13544, 21.96325, 21.7947, 21.62973, 21.46823, 21.31012, 21.15532, 21.00375, 20.85532, 20.70997, 20.56762, 20.4282, 20.29165, 20.15789, 20.02687, 19.8985, 19.77275, 19.64953, 19.5288, 19.41049, 19.29454, 19.18088, 19.06947, 18.96025, 18.85316, 18.74816, 18.64519, 18.54421, 18.44515, 18.34797, 18.25262, 18.15905, 18.06722, 17.97706, 17.88854, 17.80161, 17.71622, 17.63233, 17.54991, 17.46889, 17.38925, 17.31095, 17.23394, 17.15819, 17.08366, 17.01032, 16.93813, 16.86707, 16.79709, 16.72819, 16.66032, 16.59348, 16.52765, 16.46278, 16.39887, 16.33588, 16.27379, 16.21259, 16.15224, 16.09274, 16.03405, 15.97617, 15.91908, 15.86276, 15.80718, 15.75235, 15.69824, 15.64484, 15.59212, 15.54009, 15.48873, 15.43801, 15.38794, 15.3385, 15.28968, 15.24146, 15.19384, 15.1468, 15.10034, 15.05444, 15.0091, 14.9643, 14.92004, 14.8763, 14.83308, 14.79037, 14.74816, 14.70645, 14.66521, 14.62446, 14.58417, 14.54435, 14.50499, 14.46608, 14.42761, 14.38958, 14.35198, 14.31481, 14.27805, 14.2417, 14.20577, 14.17023, 14.13509, 14.10033, 14.06597, 14.03198, 13.99836, 13.96512, 13.93224, 13.89972, 13.86756, 13.83574, 13.80427, 13.77315, 13.74235, 13.7119, 13.68177, 13.65197, 13.62248, 13.59332, 13.56447, 13.53593, 13.5077, 13.47977, 13.45214, 13.42481, 13.39777, 13.37103, 13.34457, 13.3184, 13.29251, 13.2669, 13.24157, 13.21651, 13.19172, 13.1672, 13.14295, 13.11897, 13.09524, 13.07178, 13.04857, 13.02562, 13.00292, 12.98048, 12.95828, 12.93634, 12.91463, 12.89318, 12.87196, 12.85099, 12.83026, 12.80977, 12.78952, 12.7695, 12.74972, 12.73017, 12.71086, 12.69178, 12.67294, 12.65433, 12.63595, 12.61781, 12.59991, 12.58223, 12.56479, 12.54758, 12.53059, 12.51384, 12.49731, 12.48099, 12.4649, 12.44902, 12.43336, 12.4179, 12.40265, 12.3876, 12.37275, 12.3581, 12.34365, 12.32939, 12.31533, 12.30145, 12.28776, 12.27426, 12.26095, 12.24782, 12.23486, 12.22209, 12.2095, 12.19708, 12.18484, 12.17278, 12.16089, 12.14916, 12.13761, 12.12623, 12.11502, 12.10397, 12.09308, 12.08237, 12.07181, 12.06142, 12.05119, 12.04111, 12.0312, 12.02144, 12.01185, 12.0024, 11.99311, 11.98398, 11.975, 11.96617, 11.9575, 11.94897, 11.94059, 11.93237, 11.92429, 11.91636, 11.90857, 11.90093, 11.89344, 11.88609, 11.87889, 11.87183, 11.86491, 11.85813, 11.8515, 11.845, 11.83865, 11.83243, 11.82636, 11.82042, 11.81462, 11.80896, 11.80343, 11.79804, 11.79279, 11.78767, 11.78269, 11.77784, 11.77313, 11.76855, 11.76411, 11.75979, 11.75561, 11.75157, 11.74765, 11.74387, 11.74021, 11.73669, 11.7333, 11.73004, 11.72691, 11.72391, 11.72103, 11.71829, 11.71568}; double Deps2[636] = {4.274203, 4.330854, 4.38768, 4.444702, 4.50194, 4.559418, 4.588255, 4.617162, 4.646142, 4.675199, 4.704337, 4.73356, 4.762873, 4.79228, 4.821785, 4.851392, 4.881108, 4.910936, 4.940883, 4.970954, 5.001153, 5.031487, 5.061961, 5.092581, 5.123355, 5.154287, 5.185384, 5.216653, 5.248101, 5.279733, 5.311558, 5.343583, 5.375815, 5.408262, 5.440931, 5.47383, 5.506967, 5.540352, 5.57399, 5.607891, 5.642064, 5.676517, 5.71126, 5.746302, 5.781652, 5.817317, 5.85331, 5.88964, 5.926316, 5.963348, 6.000746, 6.038524, 6.076687, 6.115249, 6.154219, 6.193609, 6.23343, 6.273693, 6.314411, 6.355592, 6.397253, 6.4394, 6.482052, 6.525213, 6.568902, 6.61313, 6.65791, 6.703253, 6.749174, 6.795688, 6.842807, 6.890543, 6.938916, 6.987937, 7.037621, 7.087988, 7.139049, 7.190822, 7.243329, 7.296581, 7.350599, 7.405403, 7.461009, 7.517442, 7.574715, 7.632854, 7.691884, 7.75182, 7.812689, 7.874513, 7.93732, 8.001142, 8.066008, 8.131964, 8.199053, 8.267352, 8.336951, 8.40798, 8.480617, 8.555095, 8.63173, 8.710924, 8.793157, 8.878983, 8.969019, 9.063874, 9.164091, 9.270065, 9.38195, 9.499559, 9.622295, 9.749122, 9.878532, 10.00866, 10.13734, 10.26233, 10.38141, 10.49262, 10.59441, 10.68572, 10.76608, 10.83556, 10.89473, 10.94455, 10.98626, 11.02123, 11.05084, 11.07642, 11.09913, 11.11998, 11.13979, 11.15919, 11.17867, 11.19857, 11.21917, 11.24062, 11.26306, 11.28658, 11.31123, 11.33707, 11.36413, 11.39246, 11.42209, 11.45306, 11.48541, 11.51919, 11.55445, 11.59124, 11.62964, 11.66971, 11.71155, 11.75524, 11.80089, 11.84861, 11.89854, 11.95082, 12.00559, 12.06303, 12.12331, 12.18664, 12.25321, 12.32325, 12.39698, 12.47467, 12.55656, 12.64293, 12.73407, 12.83027, 12.93186, 13.03917, 13.15251, 13.27227, 13.39881, 13.5325, 13.67375, 13.82295, 13.98054, 14.14694, 14.32262, 14.50802, 14.70363, 14.90993, 15.12744, 15.35667, 15.59814, 15.85242, 16.12008, 16.4017, 16.69793, 17.00942, 17.33697, 17.68138, 18.04366, 18.425, 18.82683, 19.25092, 19.69941, 20.17481, 20.68008, 21.21843, 21.79307, 22.40706, 23.06256, 23.76048, 24.49987, 25.27754, 26.08785, 26.92332, 27.77521, 28.635, 29.496, 30.35471, 31.21209, 32.0737, 32.94925, 33.85087, 34.79096, 35.77958, 36.82189, 37.91653, 39.05446, 40.21902, 41.38698, 42.5301, 43.61771, 44.61895, 45.50557, 46.25408, 46.84755, 47.27673, 47.54021, 47.64395, 47.59998, 47.42477, 47.13743, 46.758, 46.30604, 45.79979, 45.25539, 44.68681, 44.10572, 43.52166, 42.94221, 42.37323, 41.81906, 41.28283, 40.76655, 40.27149, 39.79813, 39.34658, 38.91651, 38.50738, 38.11846, 37.74894, 37.39794, 37.06456, 36.7479, 36.44709, 36.16123, 35.88948, 35.63104, 35.38511, 35.15093, 34.92782, 34.71509, 34.51213, 34.31836, 34.13324, 33.95629, 33.78708, 33.62524, 33.47041, 33.32233, 33.18077, 33.04552, 32.91648, 32.79355, 32.67671, 32.56597, 32.46141, 32.36315, 32.27137, 32.18627, 32.10813, 32.03728, 31.97408, 31.91894, 31.87234, 31.83478, 31.80682, 31.78908, 31.78222, 31.78696, 31.80412, 31.83459, 31.87942, 31.93984, 32.01732, 32.11365, 32.23106, 32.37226, 32.54051, 32.73964, 32.9739, 33.24765, 33.56477, 33.92752, 34.33495, 34.78052, 35.24919, 35.71436, 36.13536, 36.457, 36.61217, 36.52856, 36.1389, 35.39326, 34.27005, 32.78273, 30.97944, 28.93601, 26.74359, 24.49498, 22.27232, 20.13994, 18.14163, 16.30198, 14.63067, 13.12673, 11.78282, 10.58825, 9.530922, 8.598468, 7.77882, 7.060424, 6.432417, 5.884574, 5.407375, 4.992016, 4.630362, 4.314969, 4.039096, 3.796665, 3.582279, 3.391196, 3.219325, 3.063192, 2.919909, 2.787128, 2.66298, 2.546027, 2.435181, 2.329642, 2.228832, 2.13234, 2.03987, 1.951202, 1.866168, 1.784631, 1.706471, 1.631581, 1.559857, 1.491201, 1.42552, 1.362715, 1.302697, 1.245376, 1.190658, 1.138459, 1.088693, 1.041276, 0.9961207, 0.9531495, 0.9122814, 0.873437, 0.8365411, 0.8015165, 0.76829, 0.7367896, 0.7069441, 0.6786839, 0.6519419, 0.6266514, 0.6027477, 0.5801681, 0.5588508, 0.5387357, 0.5197641, 0.5018789, 0.4850246, 0.4691478, 0.4541952, 0.4401164, 0.4268623, 0.4143842, 0.4026367, 0.3915745, 0.3811547, 0.3713354, 0.3620765, 0.3533393, 0.3450868, 0.3372833, 0.3298948, 0.3228887, 0.3162344, 0.309902, 0.303864, 0.2980939, 0.2925666, 0.287259, 0.2821493, 0.2772173, 0.2724442, 0.2678127, 0.2633072, 0.2589133, 0.2546183, 0.2504109, 0.2462808, 0.2422195, 0.2382195, 0.2342746, 0.2303794, 0.2265296, 0.2227219, 0.2189534, 0.2152221, 0.2115265, 0.2078654, 0.2042379, 0.2006435, 0.1970817, 0.1935523, 0.1900551, 0.18659, 0.1831569, 0.1797559, 0.1763867, 0.1730496, 0.1697443, 0.166471, 0.1632297, 0.1600202, 0.1568427, 0.1536972, 0.1505836, 0.1475019, 0.1444521, 0.1414343, 0.1384484, 0.1354945, 0.1325725, 0.1296824, 0.1268242, 0.123998, 0.1212038, 0.1184414, 0.115711, 0.1130125, 0.110346, 0.1077114, 0.1051087, 0.102538, 0.09999921, 0.09749233, 0.0950174, 0.09257441, 0.09016334, 0.08778423, 0.08543704, 0.08312178, 0.08083847, 0.07858705, 0.07636762, 0.07418011, 0.0720245, 0.06990087, 0.06780914, 0.06574937, 0.06372152, 0.0617256, 0.05976164, 0.0578296, 0.05592949, 0.05406131, 0.05222507, 0.05042078, 0.0486484, 0.04690797, 0.04519947, 0.0435229, 0.04187828, 0.04026558, 0.03868482, 0.03713599, 0.0356191, 0.03413414, 0.03268111, 0.03126003, 0.02987087, 0.02851365, 0.02718837, 0.02589502, 0.02463359, 0.02340412, 0.02220658, 0.02104097, 0.01990729, 0.01880555, 0.01773573, 0.01669786, 0.01569192, 0.01471792, 0.01377585, 0.01286572, 0.01198751, 0.01114125, 0.01032692, 0.009544512, 0.00879405, 0.008075525, 0.007388929, 0.006734272, 0.006111549, 0.005520747, 0.004961882, 0.004434939, 0.003939909, 0.003476772, 0.003045494, 0.002646028, 0.002278283, 0.001942119, 0.001637321, 0.001363552, 0.001120321, 0.0009069202, 0.0007223655, 0.0005653467, 0.0004341832, 0.0003268211, 0.000240871, 0.0001736798, 0.0001224562, 8.440727e-005, 5.688252e-005, 3.748945e-005, 2.417555e-005, 1.526173e-005, 9.43575e-006, 5.714574e-006, 3.389924e-006, 1.968831e-006, 1.118701e-006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; double e = val_energy(l); int i0 = 0; double e0 = DeV[i0]; int i1 = 635; double e1 = DeV[i1]; if(e > e0 || e < e1) mediaerror("n_Si_HJM: Data not available at this wavelength"); int ii; while(i1-i0 > 1) { ii = (int) floor((((double) i0)+((double) i1))/2.0+0.5); double ei = DeV[ii]; if(e >= ei) { i1 = ii; e1 = ei; } else { i0 = ii; e0 = ei; } } if(e > e0 || e < e1) mediaerror("n_Si_HJM: data search, confused"); Complex eps0 = Complex(Deps1[i0], Deps2[i0]); Complex eps1 = Complex(Deps1[i1], Deps2[i1]); // complex conjugate: sign convention, // attenuation represented by negative imaginary part of the permittivity return (eps0+(eps1-eps0)*(e-e0)/(e1-e0)).conj(); } /* Si, complex refractive index at wavelength l (micrometer) */ Complex n_Si_HJM(double l) { Complex e = eps_Si_HJM(l); return sqrt(e); } /* SiO2, refractive index at wavelength l (micrometer) */ double eV0_SiO2_HJM = 6.6; double eV1_SiO2_HJM = 0.7; double n_SiO2_HJM(double l) { double DeV[586] = {6.60, 6.58, 6.56, 6.54, 6.52, 6.50, 6.49, 6.48, 6.47, 6.46, 6.45, 6.44, 6.43, 6.42, 6.41, 6.40, 6.39, 6.38, 6.37, 6.36, 6.35, 6.34, 6.33, 6.32, 6.31, 6.30, 6.29, 6.28, 6.27, 6.26, 6.25, 6.24, 6.23, 6.22, 6.21, 6.20, 6.19, 6.18, 6.17, 6.16, 6.15, 6.14, 6.13, 6.12, 6.11, 6.10, 6.09, 6.08, 6.07, 6.06, 6.05, 6.04, 6.03, 6.02, 6.01, 6.00, 5.99, 5.98, 5.97, 5.96, 5.95, 5.94, 5.93, 5.92, 5.91, 5.90, 5.89, 5.88, 5.87, 5.86, 5.85, 5.84, 5.83, 5.82, 5.81, 5.80, 5.79, 5.78, 5.77, 5.76, 5.75, 5.74, 5.73, 5.72, 5.71, 5.70, 5.69, 5.68, 5.67, 5.66, 5.65, 5.64, 5.63, 5.62, 5.61, 5.60, 5.59, 5.58, 5.57, 5.56, 5.55, 5.54, 5.53, 5.52, 5.51, 5.50, 5.49, 5.48, 5.47, 5.46, 5.45, 5.44, 5.43, 5.42, 5.41, 5.40, 5.39, 5.38, 5.37, 5.36, 5.35, 5.34, 5.33, 5.32, 5.31, 5.30, 5.29, 5.28, 5.27, 5.26, 5.25, 5.24, 5.23, 5.22, 5.21, 5.20, 5.19, 5.18, 5.17, 5.16, 5.15, 5.14, 5.13, 5.12, 5.11, 5.10, 5.09, 5.08, 5.07, 5.06, 5.05, 5.04, 5.03, 5.02, 5.01, 5.00, 4.99, 4.98, 4.97, 4.96, 4.95, 4.94, 4.93, 4.92, 4.91, 4.90, 4.89, 4.88, 4.87, 4.86, 4.85, 4.84, 4.83, 4.82, 4.81, 4.80, 4.79, 4.78, 4.77, 4.76, 4.75, 4.74, 4.73, 4.72, 4.71, 4.70, 4.69, 4.68, 4.67, 4.66, 4.65, 4.64, 4.63, 4.62, 4.61, 4.60, 4.59, 4.58, 4.57, 4.56, 4.55, 4.54, 4.53, 4.52, 4.51, 4.50, 4.49, 4.48, 4.47, 4.46, 4.45, 4.44, 4.43, 4.42, 4.41, 4.40, 4.39, 4.38, 4.37, 4.36, 4.35, 4.34, 4.33, 4.32, 4.31, 4.30, 4.29, 4.28, 4.27, 4.26, 4.25, 4.24, 4.23, 4.22, 4.21, 4.20, 4.19, 4.18, 4.17, 4.16, 4.15, 4.14, 4.13, 4.12, 4.11, 4.10, 4.09, 4.08, 4.07, 4.06, 4.05, 4.04, 4.03, 4.02, 4.01, 4.00, 3.99, 3.98, 3.97, 3.96, 3.95, 3.94, 3.93, 3.92, 3.91, 3.90, 3.89, 3.88, 3.87, 3.86, 3.85, 3.84, 3.83, 3.82, 3.81, 3.80, 3.79, 3.78, 3.77, 3.76, 3.75, 3.74, 3.73, 3.72, 3.71, 3.70, 3.69, 3.68, 3.67, 3.66, 3.65, 3.64, 3.63, 3.62, 3.61, 3.60, 3.59, 3.58, 3.57, 3.56, 3.55, 3.54, 3.53, 3.52, 3.51, 3.50, 3.49, 3.48, 3.47, 3.46, 3.45, 3.44, 3.43, 3.42, 3.41, 3.40, 3.39, 3.38, 3.37, 3.36, 3.35, 3.34, 3.33, 3.32, 3.31, 3.30, 3.29, 3.28, 3.27, 3.26, 3.25, 3.24, 3.23, 3.22, 3.21, 3.20, 3.19, 3.18, 3.17, 3.16, 3.15, 3.14, 3.13, 3.12, 3.11, 3.10, 3.09, 3.08, 3.07, 3.06, 3.05, 3.04, 3.03, 3.02, 3.01, 3.00, 2.99, 2.98, 2.97, 2.96, 2.95, 2.94, 2.93, 2.92, 2.91, 2.90, 2.89, 2.88, 2.87, 2.86, 2.85, 2.84, 2.83, 2.82, 2.81, 2.80, 2.79, 2.78, 2.77, 2.76, 2.75, 2.74, 2.73, 2.72, 2.71, 2.70, 2.69, 2.68, 2.67, 2.66, 2.65, 2.64, 2.63, 2.62, 2.61, 2.60, 2.59, 2.58, 2.57, 2.56, 2.55, 2.54, 2.53, 2.52, 2.51, 2.50, 2.49, 2.48, 2.47, 2.46, 2.45, 2.44, 2.43, 2.42, 2.41, 2.40, 2.39, 2.38, 2.37, 2.36, 2.35, 2.34, 2.33, 2.32, 2.31, 2.30, 2.29, 2.28, 2.27, 2.26, 2.25, 2.24, 2.23, 2.22, 2.21, 2.20, 2.19, 2.18, 2.17, 2.16, 2.15, 2.14, 2.13, 2.12, 2.11, 2.10, 2.09, 2.08, 2.07, 2.06, 2.05, 2.04, 2.03, 2.02, 2.01, 2.00, 1.99, 1.98, 1.97, 1.96, 1.95, 1.94, 1.93, 1.92, 1.91, 1.90, 1.89, 1.88, 1.87, 1.86, 1.85, 1.84, 1.83, 1.82, 1.81, 1.80, 1.79, 1.78, 1.77, 1.76, 1.75, 1.74, 1.73, 1.72, 1.71, 1.70, 1.69, 1.68, 1.67, 1.66, 1.65, 1.64, 1.63, 1.62, 1.61, 1.60, 1.59, 1.58, 1.57, 1.56, 1.55, 1.54, 1.53, 1.52, 1.51, 1.50, 1.49, 1.48, 1.47, 1.46, 1.45, 1.44, 1.43, 1.42, 1.41, 1.40, 1.39, 1.38, 1.37, 1.36, 1.35, 1.34, 1.33, 1.32, 1.31, 1.30, 1.29, 1.28, 1.27, 1.26, 1.25, 1.24, 1.23, 1.22, 1.21, 1.20, 1.19, 1.18, 1.17, 1.16, 1.15, 1.14, 1.13, 1.12, 1.11, 1.10, 1.09, 1.08, 1.07, 1.06, 1.05, 1.04, 1.03, 1.02, 1.01, 1.00, 0.99, 0.98, 0.97, 0.96, 0.95, 0.94, 0.93, 0.92, 0.91, 0.90, 0.89, 0.88, 0.87, 0.86, 0.85, 0.84, 0.83, 0.82, 0.81, 0.80, 0.79, 0.78, 0.77, 0.76, 0.75, 0.74, 0.73, 0.72, 0.71, 0.70}; double Dn[586] = {1.575262, 1.574262, 1.57327, 1.572285, 1.571308, 1.570338, 1.569856, 1.569376, 1.568897, 1.568421, 1.567946, 1.567473, 1.567002, 1.566532, 1.566065, 1.565599, 1.565135, 1.564672, 1.564212, 1.563753, 1.563296, 1.56284, 1.562386, 1.561934, 1.561484, 1.561035, 1.560588, 1.560143, 1.559699, 1.559257, 1.558817, 1.558378, 1.557941, 1.557506, 1.557072, 1.55664, 1.556209, 1.55578, 1.555353, 1.554927, 1.554503, 1.55408, 1.553659, 1.553239, 1.552821, 1.552405, 1.55199, 1.551576, 1.551164, 1.550754, 1.550345, 1.549937, 1.549532, 1.549127, 1.548724, 1.548323, 1.547923, 1.547524, 1.547127, 1.546731, 1.546337, 1.545944, 1.545553, 1.545163, 1.544774, 1.544387, 1.544001, 1.543617, 1.543234, 1.542853, 1.542472, 1.542094, 1.541716, 1.54134, 1.540965, 1.540592, 1.54022, 1.539849, 1.53948, 1.539112, 1.538745, 1.53838, 1.538016, 1.537653, 1.537291, 1.536931, 1.536572, 1.536215, 1.535858, 1.535503, 1.535149, 1.534797, 1.534445, 1.534095, 1.533747, 1.533399, 1.533053, 1.532708, 1.532364, 1.532021, 1.53168, 1.53134, 1.531, 1.530663, 1.530326, 1.529991, 1.529656, 1.529323, 1.528992, 1.528661, 1.528331, 1.528003, 1.527676, 1.52735, 1.527025, 1.526701, 1.526378, 1.526057, 1.525737, 1.525417, 1.525099, 1.524782, 1.524466, 1.524152, 1.523838, 1.523525, 1.523214, 1.522904, 1.522594, 1.522286, 1.521979, 1.521673, 1.521368, 1.521064, 1.520761, 1.52046, 1.520159, 1.519859, 1.519561, 1.519263, 1.518967, 1.518671, 1.518377, 1.518083, 1.517791, 1.517499, 1.517209, 1.51692, 1.516631, 1.516344, 1.516058, 1.515772, 1.515488, 1.515205, 1.514922, 1.514641, 1.51436, 1.514081, 1.513803, 1.513525, 1.513249, 1.512973, 1.512698, 1.512425, 1.512152, 1.51188, 1.51161, 1.51134, 1.511071, 1.510803, 1.510536, 1.51027, 1.510005, 1.50974, 1.509477, 1.509215, 1.508953, 1.508692, 1.508433, 1.508174, 1.507916, 1.507659, 1.507403, 1.507148, 1.506893, 1.50664, 1.506387, 1.506136, 1.505885, 1.505635, 1.505386, 1.505138, 1.50489, 1.504644, 1.504398, 1.504153, 1.503909, 1.503666, 1.503424, 1.503183, 1.502942, 1.502702, 1.502463, 1.502225, 1.501988, 1.501752, 1.501516, 1.501281, 1.501048, 1.500814, 1.500582, 1.500351, 1.50012, 1.49989, 1.499661, 1.499433, 1.499205, 1.498978, 1.498753, 1.498527, 1.498303, 1.49808, 1.497857, 1.497635, 1.497414, 1.497193, 1.496973, 1.496755, 1.496536, 1.496319, 1.496102, 1.495887, 1.495671, 1.495457, 1.495243, 1.495031, 1.494818, 1.494607, 1.494396, 1.494187, 1.493977, 1.493769, 1.493561, 1.493354, 1.493148, 1.492943, 1.492738, 1.492534, 1.49233, 1.492128, 1.491926, 1.491725, 1.491524, 1.491324, 1.491125, 1.490927, 1.490729, 1.490532, 1.490336, 1.49014, 1.489946, 1.489751, 1.489558, 1.489365, 1.489173, 1.488981, 1.488791, 1.4886, 1.488411, 1.488222, 1.488034, 1.487847, 1.48766, 1.487474, 1.487288, 1.487104, 1.486919, 1.486736, 1.486553, 1.486371, 1.486189, 1.486009, 1.485828, 1.485649, 1.48547, 1.485292, 1.485114, 1.484937, 1.48476, 1.484585, 1.48441, 1.484235, 1.484061, 1.483888, 1.483715, 1.483543, 1.483372, 1.483201, 1.483031, 1.482862, 1.482693, 1.482524, 1.482357, 1.482189, 1.482023, 1.481857, 1.481692, 1.481527, 1.481363, 1.481199, 1.481037, 1.480874, 1.480712, 1.480551, 1.480391, 1.480231, 1.480071, 1.479913, 1.479754, 1.479597, 1.47944, 1.479283, 1.479127, 1.478972, 1.478817, 1.478663, 1.478509, 1.478356, 1.478203, 1.478051, 1.4779, 1.477749, 1.477599, 1.477449, 1.4773, 1.477151, 1.477003, 1.476855, 1.476708, 1.476562, 1.476416, 1.47627, 1.476126, 1.475981, 1.475837, 1.475694, 1.475551, 1.475409, 1.475267, 1.475126, 1.474986, 1.474845, 1.474706, 1.474567, 1.474428, 1.47429, 1.474152, 1.474015, 1.473879, 1.473743, 1.473607, 1.473472, 1.473338, 1.473204, 1.47307, 1.472937, 1.472804, 1.472672, 1.472541, 1.47241, 1.472279, 1.472149, 1.472019, 1.47189, 1.471761, 1.471633, 1.471506, 1.471378, 1.471252, 1.471125, 1.470999, 1.470874, 1.470749, 1.470625, 1.470501, 1.470377, 1.470254, 1.470131, 1.470009, 1.469887, 1.469766, 1.469645, 1.469525, 1.469405, 1.469285, 1.469166, 1.469048, 1.468929, 1.468812, 1.468694, 1.468577, 1.468461, 1.468345, 1.468229, 1.468114, 1.467999, 1.467885, 1.467771, 1.467657, 1.467544, 1.467431, 1.467319, 1.467207, 1.467095, 1.466984, 1.466873, 1.466763, 1.466653, 1.466543, 1.466434, 1.466325, 1.466216, 1.466108, 1.466, 1.465893, 1.465786, 1.465679, 1.465573, 1.465467, 1.465361, 1.465256, 1.465151, 1.465046, 1.464942, 1.464838, 1.464735, 1.464631, 1.464528, 1.464426, 1.464323, 1.464221, 1.46412, 1.464018, 1.463917, 1.463817, 1.463716, 1.463616, 1.463516, 1.463416, 1.463317, 1.463218, 1.463119, 1.463021, 1.462922, 1.462824, 1.462727, 1.462629, 1.462532, 1.462435, 1.462338, 1.462241, 1.462145, 1.462049, 1.461953, 1.461857, 1.461762, 1.461666, 1.461571, 1.461476, 1.461381, 1.461287, 1.461192, 1.461098, 1.461004, 1.46091, 1.460816, 1.460722, 1.460628, 1.460534, 1.460441, 1.460347, 1.460254, 1.460161, 1.460068, 1.459974, 1.459881, 1.459788, 1.459695, 1.459602, 1.459509, 1.459416, 1.459323, 1.45923, 1.459136, 1.459043, 1.45895, 1.458856, 1.458763, 1.458669, 1.458576, 1.458482, 1.458388, 1.458293, 1.458199, 1.458104, 1.458009, 1.457914, 1.457819, 1.457723, 1.457627, 1.457531, 1.457434, 1.457337, 1.45724, 1.457142, 1.457043, 1.456945, 1.456845, 1.456746, 1.456645, 1.456544, 1.456443, 1.456341, 1.456238, 1.456134, 1.45603, 1.455925, 1.455819, 1.455712, 1.455605, 1.455496, 1.455386, 1.455276, 1.455164, 1.455051, 1.454937, 1.454822, 1.454705, 1.454587, 1.454468, 1.454347, 1.454225, 1.454101, 1.453975, 1.453847, 1.453718, 1.453587, 1.453453, 1.453318, 1.45318, 1.45304, 1.452898, 1.452753, 1.452605, 1.452455, 1.452302, 1.452145, 1.451986, 1.451823, 1.451657, 1.451487, 1.451313, 1.451135, 1.450953, 1.450767, 1.450576, 1.45038, 1.450179, 1.449973, 1.449761, 1.449543, 1.449319, 1.449088, 1.44885, 1.448606, 1.448353, 1.448093, 1.447824, 1.447546, 1.447258, 1.446961, 1.446653, 1.446334, 1.446003, 1.44566, 1.445303}; double e = val_energy(l); int i0 = 0; double e0 = DeV[i0]; int i1 = 585; double e1 = DeV[i1]; if(e > e0 || e < e1) mediaerror("n_SiO2_HJM: Data not available at this wavelength"); int ii; while(i1-i0 > 1) { ii = (int) floor((((double) i0)+((double) i1))/2.0+0.5); double ei = DeV[ii]; if(e >= ei) { i1 = ii; e1 = ei; } else { i0 = ii; e0 = ei; } } if(e > e0 || e < e1) mediaerror("n_SiO2_HJM: data search, confused"); double n0 = Dn[i0]; double n1 = Dn[i1]; return n0+(n1-n0)*(e-e0)/(e1-e0); } /* ------------------------------------------------------------------------ */ /* G.J. Edwards and M. Lawrence. A temperature-dependent dispersion equation for congruently grown lithium niobate. Optical and Quantum Electronics, 16:373–375, 1984 [EdL84] */ double EdL_A_no[5] = {0, 4.9048, 0.11775, 0.21802, 0.027153}; double EdL_B_no[4] = {0, 2.2314e-8, -2.9671e-8, 2.1429e-8}; double EdL_A_ne[5] = {0, 4.5820, 0.09921, 0.21090, 0.021940}; double EdL_B_ne[4] = {0, 5.2716e-8, -4.9143e-8, 2.2971e-7}; double l0_LiNbO3_EdL = 0.4; double l1_LiNbO3_EdL = 4.5; /* ordinary d = 'o' or extraordinary refractive index d = 'e', at temperature t (deg. Celsius) for vacuum wavelength l (micrometer) */ double n_EdL(char d, double t, double l) { double A1, A2, A3, A4, B1, B2, B3; if(d == 'o') { A1 = EdL_A_no[1]; A2 = EdL_A_no[2]; A3 = EdL_A_no[3]; A4 = EdL_A_no[4]; B1 = EdL_B_no[1]; B2 = EdL_B_no[2]; B3 = EdL_B_no[3]; } else { A1 = EdL_A_ne[1]; A2 = EdL_A_ne[2]; A3 = EdL_A_ne[3]; A4 = EdL_A_ne[4]; B1 = EdL_B_ne[1]; B2 = EdL_B_ne[2]; B3 = EdL_B_ne[3]; } double T0 = 24.5; double F = (t-T0)*(t+T0+546.0); double nq = A1+(A2+B1*F)/(l*l-(A3+B2*F)*(A3+B2*F))+B3*F-A4*l*l; return sqrt(nq); } /* ------------------------------------------------------------------------ */ /* L. Ebers, A. Ferreri, M. Hammer, M. Albert, C. Meier, J. Foerstner, P.R. Sharapova, Flexible source of correlated photons based on LNOI rib waveguides, Journal of Physics: Photonics 4(2), 025001 (2022) [EFH22] */ double EFH_ne_er = 1.5015; double EFH_ne_As = 0.98627; double EFH_ne_Es = 6.4608; double EFH_ne_At = 282.99; double EFH_ne_Et = 5.0543; double EFH_ne_Ct = 1.4905; double EFH_ne_Eg = 4.2919; double EFH_no_er = 1.3135; double EFH_no_As = 0.71791; double EFH_no_Es = 6.7798; double EFH_no_At = 497.17; double EFH_no_Et = 4.9351; double EFH_no_Ct = 1.0358; double EFH_no_Eg = 4.3305; double l0_TFLN_EFH = 0.59; double l1_TFLN_EFH = 1.71; double epsSellm_EFH(char d, double E) { double As, Es; if(d == 'o') { As = EFH_no_As; Es = EFH_no_Es; } else { As = EFH_ne_As; Es = EFH_ne_Es; } return As*Es*Es/(Es*Es - E*E); } double epsimTL_EFH(char d, double E) { double At, Et, Ct, Eg; if(d == 'o') { At = EFH_no_At; Et = EFH_no_Et; Ct = EFH_no_Ct; Eg = EFH_no_Eg; } else { At = EFH_ne_At; Et = EFH_ne_Et; Ct = EFH_ne_Ct; Eg = EFH_ne_Eg; } if(E <= Eg) return 0.0; return (At*Et*Ct*(E-Eg)*(E-Eg))/(((E*E-Et*Et)*(E*E-Et*Et)+Ct*Ct*E*E)*E); } double integrand_EFH(char d, double E, double xi) { if(xi <= E) { fprintf(stderr, "n_EFH: not implemented for this wavelength.\n"); exit(1); } return xi*epsimTL_EFH(d, xi)/(xi*xi-E*E); } double epsreTL_EFH(char d, double E) { double Eg; if(d == 'o') Eg = EFH_no_Eg; else Eg = EFH_ne_Eg; double Eend = 300; double N = 300; double x0 = Eg; double x1 = Eend; double xr, xm, dx, x; static double xc[] = {0.0, 0.1488743389, 0.4333953941, 0.6794095682, 0.8650633666, 0.9739065285}; static double wc[] = {0.0, 0.2955242247, 0.2692667193, 0.2190863625, 0.1494513491, 0.0666713443}; double sum = 0.0; double a, b, step; step = (x1-x0)/((double) N); double s, fval; for(int i=0; i<=N-1; ++i) { a = x0+((double) i)*step; b = a+step; xm = 0.5*(b+a); xr = 0.5*(b-a); s = 0.0; for(int j=1; j<=5; j++) { dx = xr*xc[j]; x = xm+dx; fval = integrand_EFH(d, E, x); x = xm-dx; fval += integrand_EFH(d, E, x); s += wc[j]*fval; } sum += s*xr; } return 2.0*sum/PI; } /* ordinary d = 'o' or extraordinary refractive index d = 'e', for vacuum wavelength l (micrometer) */ Complex n_EFH(char d, double l) { double h = 6.62607004e-34; double c = 2.99792458e+8; double e = 1.6021766208e-19; double E; E = h*c/e*(1.0e+6)/l; double epsi = epsimTL_EFH(d, E); double er; if(d == 'o') er = EFH_no_er; else er = EFH_ne_er; double epsr = er + epsSellm_EFH(d, E) + epsreTL_EFH(d, E); double epsa = sqrt(epsr*epsr+epsi*epsi); return Complex(sqrt(0.5*(epsa+epsr)), -sqrt(0.5*(epsa-epsr))); } /* ---------------------------------------------------------------------- * Medium::property methods; not all are applicable to all media * ---------------------------------------------------------------------- */ Medium::Medium() { type = AIR; wlrange = Interval(MEDIA_SMALLWAVELENGTH, MEDIA_LARGEWAVELENGTH); } Medium::Medium(const MediumID id) { type = id; double hc; switch(type) { case AIR: wlrange = Interval(MEDIA_SMALLWAVELENGTH, MEDIA_LARGEWAVELENGTH); break; case SiO2: hc = val_energy(1.0); wlrange = Interval(hc/eV1_SiO2_HJM, hc/eV0_SiO2_HJM); break; case Si: hc = val_energy(1.0); wlrange = Interval(hc/eV1_Si_HJM, hc/eV0_Si_HJM); break; case LiNbO3: wlrange = Interval(l0_LiNbO3_EdL, l1_LiNbO3_EdL); break; case TFLN: wlrange = Interval(l0_TFLN_EFH, l1_TFLN_EFH); break; default: mediaerror("Medium(): instance not implemented"); break; } } /* ---------------------------------------------------------------------- */ /* refractive index at wavelength lambda */ double Medium::n(const double lambda) const { if(lambda < wlrange.x0 || lambda > wlrange.x1) mediaerror("n: data not available for this wavelength"); double r = 1.0; Complex rc = CC1; switch(type) { case AIR: r = 1.0; return r; break; case SiO2: r = n_SiO2_HJM(lambda); return r; break; case Si: rc = n_Si_HJM(lambda); if(fabs(rc.im) > MEDIA_Nim_NEGLECT) mediaerror("n, Si: attenuation not negligible"); return rc.re; break; case LiNbO3: mediaerror("n, LiNbO3: birefringent medium"); break; case TFLN: mediaerror("n, TFLN: birefringent medium"); break; default: mediaerror("n: medium not implemented"); break; } return 1.0; } /* complex refractive index at wavelength lambda */ Complex Medium::nC(const double lambda) const { if(lambda < wlrange.x0 || lambda > wlrange.x1) mediaerror("nC: data not available for this wavelength"); double r = 1.0; Complex rc = CC1; switch(type) { case AIR: return CC1; break; case SiO2: r = n_SiO2_HJM(lambda); return Complex(r, 0.0); break; case Si: rc = n_Si_HJM(lambda); return rc; break; case LiNbO3: mediaerror("nC, LiNbO3: birefringent medium"); break; case TFLN: mediaerror("nC, TFLN: birefringent medium"); break; default: mediaerror("nC: medium not implemented"); break; } return CC1; } /* birefringent media, ordinary and extraordinary refractive index */ double Medium::n(const AxisID oe, const double lambda) const { if(lambda < wlrange.x0 || lambda > wlrange.x1) mediaerror("n(axis): data not available for this wavelength"); double r = 1.0; Complex cr = CC1; switch(type) { case AIR: mediaerror("n(axis), AIR: isotropic medium"); break; case SiO2: mediaerror("n(axis), SiO2: isotropic medium"); break; case Si: mediaerror("n(axis), Si: isotropic medium"); break; case LiNbO3: if(oe == ORD) r = n_EdL('o', MEDIA_TEMPERATURE, lambda); else r = n_EdL('e', MEDIA_TEMPERATURE, lambda); return r; break; case TFLN: if(oe == ORD) cr = n_EFH('o', lambda); else cr = n_EFH('e', lambda); if(fabs(cr.im) > MEDIA_Nim_NEGLECT) mediaerror("n(axis), TFLN: potentially non-negligible imaginary part"); r = cr.re; return r; break; default: mediaerror("n(axis): medium not implemented"); break; } return 1.0; } /* scalar dielectric optical permittivity */ double Medium::eps(const double lambda) const { if(lambda < wlrange.x0 || lambda > wlrange.x1) mediaerror("eps: data not available for this wavelength"); double r; Complex e; switch(type) { case AIR: r = n(lambda); return r*r; break; case SiO2: r = n(lambda); return r*r; break; case Si: e = eps_Si_HJM(lambda); if(fabs(e.im) > 2.0*MEDIA_Nim_NEGLECT) mediaerror("eps, Si: attenuation not negligible at this wavelength"); return e.re; break; case LiNbO3: mediaerror("eps, LiNbO3: birefringent medium"); break; case TFLN: mediaerror("eps, TFLN: birefringent medium"); break; default: mediaerror("eps: medium not implemented"); break; } return 1.0; } /* complex scalar dielectric optical permittivity */ Complex Medium::epsC(const double lambda) const { if(lambda < wlrange.x0 || lambda > wlrange.x1) mediaerror("epsC: data not available for this wavelength"); double r; Complex e; switch(type) { case AIR: return CC1; break; case SiO2: r = n(lambda); return Complex(r*r, 0.0); break; case Si: e = eps_Si_HJM(lambda); return e; break; case LiNbO3: mediaerror("epsC, LiNbO3: birefringent medium"); break; case TFLN: mediaerror("epsC, TFLN: birefringent medium"); break; default: mediaerror("epsC: medium not implemented"); break; } return CC1; } /* birefringent media, ordinary and extraordinary permittivity elements */ double Medium::eps(const AxisID oe, const double lambda) const { if(lambda < wlrange.x0 || lambda > wlrange.x1) mediaerror("eps(axis): data not available for this wavelength"); double r; switch(type) { case AIR: mediaerror("eps(axis): isotropic medium"); break; case SiO2: mediaerror("eps(axis): isotropic medium"); break; case Si: mediaerror("eps(axis): isotropic medium"); break; case LiNbO3: r = n(oe, lambda); return r*r; break; case TFLN: r = n(oe, lambda); return r*r; break; default: mediaerror("eps: medium not implemented"); break; } return 1.0; }