/* 
 * WMM-Application:
 * a raised strip waveguide
 */

/*
 * WMM
 * Wave-matching method for mode analysis of dielectric waveguides
 * Manfred Hammer 
 * (2002)
 */

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#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;
}

