/* * METRIC-Application: * permittivity of lithium niobate, temperature and wavelength dependent */ #include #include #include #include"metric.h" #define Temp 20.0 // standard temperature #define Wavel1 1.55 // target wavelength #define Wavel2 0.775 // target wavelength // wavelength scan #define Lambda0 0.6 // interval start #define Lambda1 1.7 // interval end #define NumL 200 // number of samples /* ------------------------------------------------------------------------ */ /* 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}; /* 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); } /* ------------------------------------------------------------------------ */ /* D.H. Jundt, Temperature-dependent Sellmeier equation for the index of refraction, n_e, in congruent lithium niobate, Optics Letters 22, 1553-1555 (1997) [Jun97] */ double Jun_a[7] = {0, 5.35583, 0.100473, 0.20692, 100.0, 11.34927, 1.5334e-2}; double Jun_b[5] = {0, 4.629e-7, 3.862e-8, -0.89e-8, 2.657e-5}; /* extraordinary refractive index at temperature t (deg. Celsius) for vacuum wavelength l (micrometer) */ double ne_Jun(double t, double l) { double a1, a2, a3, a4, a5, a6, b1, b2, b3, b4; a1 = Jun_a[1]; a2 = Jun_a[2]; a3 = Jun_a[3]; a4 = Jun_a[4]; a5 = Jun_a[5]; a6 = Jun_a[6]; b1 = Jun_b[1]; b2 = Jun_b[2]; b3 = Jun_b[3]; b4 = Jun_b[4]; double f = (t-24.5)*(t+570.82); double neq = a1+b1*f+(a2+b2*f)/(l*l-(a3+b3*f)*(a3+b3*f))+(a4+b4*f)/(l*l-a5*a5)-a6*l*l; return sqrt(neq); } /* ------------------------------------------------------------------------ */ /* 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 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))); } /* ------------------------------------------------------------------------ */ int main() { Complex no, ne; fprintf(stderr, "T = %g, lambda = %g\n", Temp, Wavel1); fprintf(stderr, "EdL83: n_e = %g, n_o = %g\n", n_EdL('e', Temp, Wavel1), n_EdL('o', Temp, Wavel1)); fprintf(stderr, "Jun97: n_e = %g\n", ne_Jun(Temp, Wavel1)); no = n_EFH('o', Wavel1); ne = n_EFH('e', Wavel1); fprintf(stderr, "EFH22: n_e = %g + i %g, n_o = %g + i %g\n", ne.re, ne.im, no.re, no.im); fprintf(stderr, "T = %g, lambda = %g\n", Temp, Wavel2); fprintf(stderr, "EdL83: n_e = %g, n_o = %g\n", n_EdL('e', Temp, Wavel2), n_EdL('o', Temp, Wavel2)); fprintf(stderr, "Jun97: n_e = %g\n", ne_Jun(Temp, Wavel2)); no = n_EFH('o', Wavel2); ne = n_EFH('e', Wavel2); fprintf(stderr, "EFH22: n_e = %g + i %g, n_o = %g + i %g\n", ne.re, ne.im, no.re, no.im); Dvector lv(NumL); Dvector noEdL(NumL); Dvector neEdL(NumL); Dvector neJun(NumL); Dvector noEFH(NumL); Dvector neEFH(NumL); double lstep = (Lambda1-Lambda0)/((double) (NumL-1)); for(int li=0; li<=NumL-1; ++li) { double l = Lambda0+((double) li)*lstep; lv(li) = l; noEdL(li) = n_EdL('o', Temp, l); neEdL(li) = n_EdL('e', Temp, l); neJun(li) = ne_Jun(Temp, l); noEFH(li) = n_EFH('o', l).re; neEFH(li) = n_EFH('e', l).re; } toxyf("noEdL", lv, noEdL); toxyf("neEdL", lv, neEdL); toxyf("neJun", lv, neJun); toxyf("noEFH", lv, noEFH); toxyf("neEFH", lv, neEFH); fprintf(stderr, "\nOk.\n"); return 0; }