/* * METRIC-Application: * A dielectric ring, analysis of whispering gallery modes */ #include #include #include #include"metric.h" #define Pol TE #define Pnb 1.0 // background refractive index #define Png 1.5 // core refractive index #define Pd 0.5 // core thickness /mum #define PR 10 // ring radius, outer rim /mum #define Wlr0 1.45 // wavelength range of interest #define Wlr1 1.65 #define DW 14.0 // display window, x-extension [-DW, DW] // display window, z-extension [-DW, DW] /* ------------------------------------------------------------------------ */ /* container for the radial dielectric profile, interface positions relative to the cavity radius */ Waveguide rwgdef() { Waveguide rwg(1); rwg.hx(1) = 0.0; rwg.hx(0) = -Pd; rwg.n(2) = Pnb; rwg.n(1) = Png; rwg.n(0) = Pnb; rwg.lambda = 0.5*(Wlr0+Wlr1); return rwg; } /* ------------------------------------------------------------------------ */ /* analysis of whispering gallery modes */ int main() { WGModeArray wgm; Waveguide rwg = rwgdef(); wgmsolve(rwg, PR, 0.0, 0.0, Pol, 0.5*(Wlr0+Wlr1), 1, -1, -1, wgm, 1); // wgmsolve(rwg, PR, 0.0, 0.0, Pol, 0.5*(Wlr0+Wlr1), 1, 50, 10, wgm, 0); // wgmsolve(rwg, PR, 0.0, 0.0, Pol, Interval(Wlr0, Wlr1), 1, 10, 10, wgm, 0); // for(int j=0; j<=wgm.num-1; ++j) wgm(j).reverse(); for(int j=0; j<=wgm.num-1; ++j) wgm(j).discretize(0.0, PR+DW, 500); for(int j=0; j<=wgm.num-1; ++j) { Complex o = wgm(j).c_omega(); double l = val_lambda(o.re); fprintf(stderr, "[%d] %s: omega = %g + i %g, lambda_r = %g, Q = %g, FWHM_lambda = %g\n", j, wgm(j).ids, o.re, o.im, l, theQ(o), FWHM_lambda(o)); Fcomp cp = principalcomp(Pol); wgm(j).plot(cp, REP, -DW, DW, -DW, DW, 350, 350, dig10(j), dig1(j)); wgm(j).plot(cp, MOD, -DW, DW, -DW, DW, 350, 350, dig10(j), dig1(j)); wgm(j).viewer(-DW, DW, -DW, DW, 350, 350, dig10(j), dig1(j)); /* Cvector p(1001); Dvector rv(1001); for(int ri=0; ri<=1000; ++ri) { double r = 3.0+((double)ri)/1000.0*(PR+10.0); rv(ri) = r; p(ri) = wgm(j).profile(r); } char name[10] = "mprf____"; name[4] = dig10(j); name[5] = dig1(j); name[6] = 'r'; name[7] = 'e'; toxyf(name, rv, p.re()); name[6] = 'i'; name[7] = 'm'; toxyf(name, rv, p.im()); name[6] = 'a'; name[7] = 'b'; toxyf(name, rv, p.abs()); */ } fprintf(stderr, "\nOk.\n"); return 0; }