sources = [ mp.EigenModeSource(mp.GaussianSource(frequency=fcen, fwidth=fwidth), eig_band=1, direction=mp.NO_DIRECTION, eig_kpoint=kpoint, size=source_size, center=source_center) ] #---------------------------------------------------------------------- #- design region and basis #---------------------------------------------------------------------- design_size = mp.Vector3(l_design, l_design, waveguide_h) design_region = mpa.Subregion(fcen, df, nfreq, name='design', center=mp.Vector3(), size=design_size) element_length = 1 element_type = 'CG 1' basis = mpa.FiniteElementBasis(region=design_region, element_length=element_length, element_type=element_type) #basis = mpa.UniformBasis(region=design_region) #beta_vector = basis.project(3.45**2) beta_vector = 5 * np.random.rand(basis.dim) design_function = basis.parameterized_function(beta_vector) design_object = [
def run_test(self, resolution, Nx, Ny): Sx = 1 Sy = 1 z = lambda x, y: 5 * np.abs((x**3 + y**2 + x**2 * y)) + 1 cell_size = mp.Vector3(Sx, Sy) design_size = mp.Vector3(Sx, Sy, 0) design_region = mpa.Subregion(name='design', center=mp.Vector3(), size=design_size) basis = mpa.BilinearInterpolationBasis(region=design_region, Nx=Nx, Ny=Ny) rho_x = np.linspace(-Sx / 2, Sx / 2, Nx) rho_y = np.linspace(-Sy / 2, Sy / 2, Ny) rho_X, rho_Y = np.meshgrid(rho_x, rho_y) rho = z(rho_X, rho_Y) beta_vector = rho.reshape(rho.size, order='C') design_function = basis.parameterized_function(beta_vector) design_object = [ mp.Block(center=design_region.center, size=design_region.size, epsilon_func=design_function.func()) ] geometry = design_object sim = mp.Simulation(cell_size=cell_size, geometry=geometry, resolution=resolution) sim.init_sim() (x_interp, y_interp, z_interp, w) = sim.get_array_metadata(center=mp.Vector3(), size=cell_size) eps_data = sim.get_array(center=mp.Vector3(), size=cell_size, component=mp.Dielectric) rho_X_interp, rho_Y_interp = np.meshgrid(x_interp, y_interp) rho_interp_true = z(rho_X_interp, rho_Y_interp) A = mpa.gen_interpolation_matrix(rho_x, rho_y, np.array(x_interp), np.array(y_interp)) rho_interp_hat = A * rho.reshape(rho.size, order='C') # Calculate errors sim_err = np.mean( np.abs( eps_data.reshape(eps_data.size, order='C') - rho_interp_true.reshape(rho_interp_true.size, order='C'))**2) A_err = np.mean( np.abs(rho_interp_hat - rho_interp_true.reshape(rho_interp_true.size, order='C'))** 2) meep_err = np.mean( np.abs(rho_interp_hat - eps_data.reshape(eps_data.size, order='C'))**2) print("Simulation Mean Squared Error: ", sim_err) print("Interpolation Matrix Mean Squared Error: ", A_err) print("MSE between interp. matrix and meep's dielectric function: ", meep_err) '''from matplotlib import pyplot as plt plt.figure() plt.imshow(eps_data) plt.title('Bilinear Interpolation') plt.figure() plt.imshow(rho_interp_hat.reshape(rho_interp_true.shape,order='C')) plt.title('Sparse Matrix Solution') plt.figure() plt.imshow(rho_interp_true) plt.title('Analytic Solution') plt.show()''' return sim_err, A_err, meep_err
sources = [mp.EigenModeSource(mp.GaussianSource(frequency=fcen,fwidth=fwidth), eig_band = 1, direction=mp.NO_DIRECTION, eig_kpoint=kpoint, size = source_size, center=source_center)] #---------------------------------------------------------------------- #- geometric objects #---------------------------------------------------------------------- geometry = [mp.Block(center=mp.Vector3(), material=mp.Medium(index=3.45), size=mp.Vector3(mp.inf, 0.5, 0) )] Nx = 10 Ny = 10 design_size = mp.Vector3(1, 1, 0) design_region = mpa.Subregion(name='design', center=mp.Vector3(), size=design_size) basis = mpa.BilinearInterpolationBasis(region=design_region,Nx=Nx,Ny=Ny) beta_vector = 11*np.random.rand(Nx*Ny) + 1 design_function = basis.parameterized_function(beta_vector) design_object = [mp.Block(center=design_region.center, size=design_region.size, epsilon_func = design_function.func())] geometry += design_object sim = mp.Simulation(cell_size=cell_size, boundary_layers=pml_layers, geometry=geometry, sources=sources, eps_averaging=False, resolution=resolution)
print(discrete_grad) quit()''' l_design = 1 waveguide_h = 0 fcen = 1 element_length = .1 element_type = 'CG 1' #---------------------------------------------------------------------- #- design region and basis #---------------------------------------------------------------------- design_size = mp.Vector3(l_design, l_design, waveguide_h) design_region = mpa.Subregion(fcen, name='design', center=mp.Vector3(), size=design_size) basis = mpa.UniformBasis(region=design_region) n = basis.dim print(n) beta_vector = 8 design_function = basis.parameterized_function(beta_vector) N = 100 x = np.linspace(-l_design/2,l_design/2,N) y = np.linspace(-l_design/2,l_design/2,N) vecs = [] eps = np.zeros((N,N)) for nx,ix in enumerate(x): for ny,iy in enumerate(y):