Closed saiGo1992 closed 8 months ago
RCWA scales poorly compared with FDTD for large-scale simulations since you need a high truncation order to get convergence. Can you share your code to take a look at what you have done?
RCWA scales poorly compared with FDTD for large-scale simulations since you need a high truncation order to get convergence. Can you share your code to take a look at what you have done?
Sure, my code as follow:
from matplotlib import pyplot as plt
import numpy as np
import grcwa
import autograd.numpy as npa
## Truncation order (actual number might be smaller)
nG = 501
## lattice constants
L1 = [2.,0]
L2 = [0,2.]
theta = 0.
phi = 0.
Qabs = np.inf
## simulation data
sim_datas = [
{'freq':[1/0.45*(1+1j/2/Qabs)],
'ep0':[ 1],
'ep1':[ 2.05**2],
'ep2':[ 1.47**2],
'epN':[ 1]}
]
## planewave excitation
planewave = {'p_amp': 1, 's_amp': 0, 'p_phase': 0, 's_phase': 0}
## the patterned layer has a griding: Nx*Ny
Np = 2 # number of patterned layers
Resolution = 200
Nx = Resolution
Ny = Resolution
interal = int(Resolution/2)
thick0 = 1. # thickness for vacuum layer 1
pthick = [0.6,5] # thickness of patterned layer
thickN = 1.
## coordinate
x0 = np.linspace(0,1.,Nx)
y0 = np.linspace(0,1.,Ny)
x, y = np.meshgrid(x0,y0,indexing='ij')
## planewave excitation
planewave = {'p_amp': 1, 's_amp': 0, 'p_phase': 0, 's_phase': 0}
binary_file = 'eps-288beta-166.587890625.txt'
binary = np.loadtxt(binary_file,delimiter=',')
plt.pcolor(x, y, binary,cmap = 'Greys_r')
plt.xticks([])
plt.yticks([])
plt.colorbar()
Pz_Ratio = 0
for i in range(len(sim_datas)):
for j in range(len(sim_datas[i]['freq'])):
######## setting up RCWA
obj = grcwa.obj(nG, L1, L2, sim_datas[i]['freq'][j], theta, phi, verbose=1)
obj.Add_LayerUniform(thick0, sim_datas[i]['ep0'][j])
for k in range(Np):
obj.Add_LayerGrid(pthick[k], Nx, Ny)
obj.Add_LayerUniform(thickN, sim_datas[i]['epN'][j])
obj.Init_Setup()
obj.MakeExcitationPlanewave(planewave['p_amp'], planewave['p_phase'], planewave['s_amp'], planewave['s_phase'],order=0)
# combine epsilon of all layers
eps = sim_datas[i]['ep0'][j] + (sim_datas[i]['ep1'][j] - sim_datas[i]['ep0'][j]) * binary
epgrid2 = npa.ones((Nx, Ny)) * sim_datas[i]['ep2'][j]
epgrid = npa.concatenate((eps.flatten(), epgrid2.flatten()))
obj.GridLayer_geteps(epgrid)
# calcalate E, H, R and T
E, H = obj.Solve_FieldOnGrid(2, 5) # E = [Ex,Ey,Ez], H = [Hx,Hy,Hz]
R, T = obj.RT_Solve(normalize=1)
#abs(Ex) and abs(Ey)
plt.figure()
plt.pcolor(x, y, abs(E[0]), cmap='jet')
plt.colorbar()
plt.figure()
plt.pcolor(x, y, abs(E[1]), cmap='jet')
plt.colorbar()
plt.show()
The txt file I use in code also have uploaded here.
RCWA scales poorly compared with FDTD for large-scale simulations since you need a high truncation order to get convergence. Can you share your code to take a look at what you have done?
Yes, RCWA needs a very high nG to converge for this kind of structure where you have a period/wavelength>1. In your case, the ratio is 4. So I feel the result at this level of nG looks quite look already. Another point is that far-field computation tends to converge much faster than near-field components in RCWA.
Description
I use grcwa to simulate a structure which has been optimized, so the geometry is complicated. In order to make sure the results are reliable, I also simulated it in lumerical FDTD module. However, the E field and P field of grcwa can not match with lumerical. I wonder is there any limitation in grcwa ? Because my simulation wave lengths are 450nm and the dimension of structure is 2um x 2um (polarization in Ex direction). The attach files are the structure I simulate, abs(Ex) and abs(Ey) profile of grcwa and lumerical for 450 nm, abs(Pz) profile of grcwa and lumerical for 450 nm.
Hope to get response soon, thanks in advences!
What I Did