/* * METRIC-Application: * A dielectric disk, 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 // disk interior, refractive index #define PR 10 // disk 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 dwgdef() { Waveguide dwg(0); dwg.hx(0) = 0.0; dwg.n(0) = Png; dwg.n(1) = Pnb; dwg.lambda = 0.5*(Wlr0+Wlr1); return dwg; } /* ------------------------------------------------------------------------ */ /* analysis of whispering gallery modes */ int main() { WGModeArray wgm; Waveguide dwg = dwgdef(); wgmsolve(dwg, PR, 0.0, 0.0, Pol, 0.5*(Wlr0+Wlr1), 1, -1, -1, wgm, 1); // wgmsolve(dwg, PR, 0.0, 0.0, Pol, 0.5*(Wlr0+Wlr1), 1, 50, 10, wgm, 0); // wgmsolve(dwg, 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; }