Package: grcwa
grcwagrcwa (autoGradable RCWA) is a python implementation of rigorous
coupled wave analysis (RCWA) for arbitrarily shaped photonic crystal
slabs, supporting automatic differentation with autogradFree software: GPL licenseDocumentation:https://grcwa.readthedocs.io.CitingIf you findgrcwauseful for your research, please cite the
following paper:@article{Jin2020,
  title = {Inverse design of lightweight broadband reflector for relativistic lightsail propulsion},
  author ={Jin, Weiliang and Li, Wei and Orenstein, Meir and Fan, Shanhui},
  year = {2020},
  journal = {ACS Photonics},
  volume = {7},
  number = {9},
  pages = {2350--2355},
  year = {2020},
  publisher = {ACS Publications}
}FeaturesRCWA solves EM-scattering problems of stacked photonic crystal
slabs. As illustrated in the above figure, the photonic structure can
haveNlayers of different thicknesses and independent spatial
dielectric profiles. All layers are periodic in the two lateral
directions, and invariant along the vertical direction.Each photonic crystal layer can have arbitrary dielectric profile on
the2Dgrids.autogradis integrated into the package, allowing for automated
and fast gradient evaluations for the sake of large-scale
optimizations. Autogradable parameters include dielectric constant on
every grid, frequency, angles, thickness of each layer, and
periodicity (however the ratio of periodicity along the two lateral
directions must be fixed).Quick StartInstallation:$pipinstallgrcwaOr,$gitclonegit://github.com/weiliangjinca/grcwa$pipinstall.Example 1: transmission and reflection (sum or by order) of a square lattice of a hole:ex1.pyExample 2: Transmission and reflection of two patterned layers:ex2.py, as illustrated in the figure below (only aunit cellis plotted)Periodicityin the lateral direction isLx=Ly= 0.2, andfrequencyis 1.0.The incident light has an angelpi/10.importgrcwaimportnumpyasnpgrcwa.set_backend('autograd')# if autograd needed# lattice constantsL1=[0.2,0]L2=[0,0.2]# Truncation order (actual number might be smaller)nG=101# frequencyfreq=1.# angletheta=np.pi/10phi=0.# setup RCWAobj=grcwa.obj(nG,L1,L2,freq,theta,phi,verbose=1)Geometry: the thicknesses of the four layers are 0.1,0.2,0.3, and 0.4. For patterned layers, we consider total grid pointsNx*Ny= 100*100 within the unit cell.Dielectric constant: 2.0 for the 0-th layer; 4.0 (1.0) for the 1st layer in the orange (void) region; 6.0 (1.0) for the 2nd layer in the bule (void) region; and 3.0 for the last layer.Np=2# number of patterned layersNx=100Ny=100thick0=0.1pthick=[0.2,0.3]thickN=0.4ep0=2.epN=3.obj.Add_LayerUniform(thick0,ep0)foriinrange(Np):obj.Add_LayerGrid(pthick[i],Nx,Ny)obj.Add_LayerUniform(thickN,epN)obj.Init_Setup()Patterned layer: the 1-th layer a circular hole of radius 0.5Lx, and the 2-nd layer has a square hole of 0.5Lxradius=0.5a=0.5ep1=4.ep2=6.epbkg=1.# coordinatex0=np.linspace(0,1.,Nx)y0=np.linspace(0,1.,Ny)x,y=np.meshgrid(x0,y0,indexing='ij')# layer 1epgrid1=np.ones((Nx,Ny))*ep1ind=(x-.5)**2+(y-.5)**2<radius**2epgrid1[ind]=epbkg# layer 2epgrid2=np.ones((Nx,Ny))*ep2ind=np.logical_and(np.abs(x-.5)<a/2andnp.abs(y-.5)<a/2))epgrid2[ind]=epbkg# combine epsilon of all layersepgrid=np.concatenate((epgrid1.flatten(),epgrid2.flatten()))obj.GridLayer_geteps(epgrid)Incident light iss-polarizedplanewave={'p_amp':0,'s_amp':1,'p_phase':0,'s_phase':0}obj.MakeExcitationPlanewave(planewave['p_amp'],planewave['p_phase'],planewave['s_amp'],planewave['s_phase'],order=0)# solve for R and TR,T=obj.RT_Solve(normalize=1)Example 3: topology optimization of reflection of a single patterned layer,ex3.pyExample 4: transmission and reflection (sum or by order) of a hexagonal lattice of a hole:ex4.pyNote on conventionsThe vacuum permittivity, permeability, and speed of light are1.The time harmonic convention isexp(-i omega t).AcknowledgementsMy implementation of RCWA received helpful discussions fromDr. Zin
Lin. Many
details of implementations were referred to a RCWA package implemented
in c calledS4. The idea of
integratingAutogradinto RCWA package rather than deriving
adjoint-variable gradient by hand was inspired by a discussion with
Dr. Ian Williamson and Dr. Momchil Minkov. The backend and many other
styles follow their implementation inlegume. Haiwen Wang and Cheng Guo
provided useful feedback. Lastly, the template was credited toCookiecutterand theaudreyr/cookiecutter-pypackage.History0.1.2 (2020-11-01)Add example for hexagonal lattice0.1.1 (2020-05-18)Fix license0.1 (2020-05-12)First release on PyPI.