/* * WMM-Application: * a raised strip waveguide */ /* * WMM * Wave-matching method for mode analysis of dielectric waveguides * Manfred Hammer * (2002) */ #include #include #include #include"wmminc.h" /* waveguide parameters */ #define Wgpnb 1.45 // substrate refractive index #define Wgpnr 1.596 // core refractive index #define Wgpna 1.0 // cladding refractive index #define Wgpw 2.75 // core width #define Wgpt 1.0 // core thickness #define Wgpl 1.55 // vacuum wavelength Polarization Mpol=QTE; // QTE or QTM, semivectorial simulation Symmetry Msym=SYM; // SYM or ASY, look for modes with even or odd // symmetry with respect to y = 0 /* display window, mode profile plots; x in [x0, x1], y in [y0, y1], format: Disp(x0, y0, x1, y1), note the axis orientation! */ Rect Disp(-2.0, -3.0, 2.0, 3.0); /* waveguide definition */ Waveguide wgdef() { Waveguide g(1, 1); g.hx(0) = 0.0; g.hx(1) = Wgpt; g.hy(0) = -Wgpw/2.0; g.hy(1) = Wgpw/2.0; g.n(0,0) = Wgpnb; g.n(0,1) = Wgpnb; g.n(0,2) = Wgpnb; g.n(1,0) = Wgpna; g.n(1,1) = Wgpnr; g.n(1,2) = Wgpna; g.n(2,0) = Wgpna; g.n(2,1) = Wgpna; g.n(2,2) = Wgpna; g.lambda = Wgpl; return g; } /* WMM analysis parameters */ WMM_Parameters pardef() { WMM_Parameters p; p.vform = HXHY; p.vnorm = NRMMH; p.ccomp = CCALL; p.ini_d_alpha = 0.02; p.ini_N_alpha = 15; p.ini_alpha_max = 2.0; p.ini_steps = 30; p.ref_num = 5; p.ref_exp = 4.0; p.ref_sdf = 0.5; p.fin_d_alpha = 0.01; p.fin_N_alpha = 30; p.fin_alpha_max = 3.0; p.btol = 1.0e-7; p.mshift = 1.0e-10; return p; } /* semivectorial mode analysis */ int main() { WMM_Parameters par = pardef(); WMM_ModeArray ma; WMM_Mode m; int j; // define the waveguide Waveguide wg = wgdef(); // for field profile plots: select the interesting field component Fcomp fcp = principalcomp(Mpol); // semivectorial mode analysis, symmetrical modes WMM_modeanalysis(wg, Mpol, Msym, 0.0, 0.0, par, 'r', 'i', ma); // for each found mode: for(j=0; j<=ma.num-1; ++j) { m = ma(j); // store the mode in a file m.write_def(dig10(j), dig1(j)); // construct mode profile plots, // contour lines, m.mfile(fcp, SQR, Disp, 100, 120, dig10(j), dig1(j), 'C'); // an image picture, m.mfile(fcp, SQR, Disp, 100, 120, dig10(j), dig1(j), 'I'); // horizontal profile cross section at x = t/2 m.secmfile(fcp, 'h', dig1(j), 500, 'L', Wgpt/2.0, Disp.y0, Wgpt/2.0, Disp.y1); // vertical profile cross section at y = 0 m.secmfile(fcp, 'v', dig1(j), 500, 'L', Disp.x0, 0.0, Disp.x1, 0.0); } ma.clear(); return 0; }