===== Usage ===== To use grcwa in a project:: import grcwa To enable autograd:: grcwa.set_backend('autograd') To initialize the RCWA:: obj = grcwa.obj(nG,L1,L2,freq,theta,phi,verbose=0) # verbose=1 for output the actual nG To add layers, the order of adding will determine the layer order (1st added layer is 0-th layer, 2nd to be 1st layer, and so forth):: obj.Add_LayerUniform(thick0,ep0) # uniform slab obj.Add_LayerGrid(thickp,Nx,Ny) # patterned layer # after add all layers: obj.Init_Setup() To feed the epsilon profile for patterned layer:: # x is a 1D array: np.concatenate((epgrid1.flatten(),epgrid2.flatten(),...)) obj.GridLayer_geteps(x) To scale the periodicity in the both lateral directions simultaneously (as an autogradable parameter):: obj.Init_Setup(Pscale=scale) # period will be scale*Lx and scale*Ly Fourier space truncation options :: obj.Init_Setup(Gmethod=0) # 0 for circular, 1 for rectangular To define planewave excitation:: obj.MakeExcitationPlanewave(p_amp,p_phase,s_amp,s_phase,order = 0) To define incidence light other than planewave:: obj.a0 = ... # forward obj.bN = ... # backward, each have a length 2*obj.nG, for the 2 lateral directions To normalize output when the 0-th media is not vacuum, or for oblique incidence:: R, T = obj.RT_Solve(normalize = 1) To get Poynting flux by order:: Ri, Ti = obj.RT_Solve(byorder=1) # Ri(Ti) has length obj.nG, too see which order, check obj.G; too see which kx,ky, check obj.kx obj.ky To get amplitude of eigenvectors at some layer at some zoffset :: ai,bi = obj.GetAmplitudes(which_layer,z_offset) To get real-space epsilon profile reconstructured from the truncated Fourier orders :: ep = obj.Return_eps(which_layer,Nx,Ny,component='xx') # For patterned layer component = 'xx','xy','yx','yy','zz'; For uniform layer, currently it's assumed to be isotropic To get Fourier amplitude of fields at some layer at some zoffset :: E,H = obj.Solve_FieldFourier(which_layer,z_offset) #E = [Ex,Ey,Ez], H = [Hx,Hy,Hz] To get fields in real space on grid points :: E,H = obj.Solve_FieldOnGrid(which_layer,z_offset) # #E = [Ex,Ey,Ez], H = [Hx,Hy,Hz] To get volume integration with respect to some convolution matrix *M* defined for 3 directions, respectively:: val = obj.Volume_integral(which_layer,Mx,My,Mz,normalize=1) To compute Maxwell stress tensor, integrated over the *z*-plane:: Tx,Ty,Tz = obj.Solve_ZStressTensorIntegral(which_layer)