diff --git a/metaprop_fibermode_doublet.py b/metaprop_fibermode_doublet.py index 79035fd..ff9b1b1 100644 --- a/metaprop_fibermode_doublet.py +++ b/metaprop_fibermode_doublet.py @@ -12,19 +12,31 @@ import nlopt import numpy as np import matplotlib.pyplot as plt +import matplotlib.patches as patches #set the global font size for all plots plt.rcParams.update({'font.size': 14}) from scipy.special import jv, kv +import os + +if not os.path.exists("results"): + os.makedirs("results") + ############################## #physics and simulation domain wavelength = 1.55e-6 +n0 = 1.0 +n1 = 1.0 +n2 = 1.0 + k0 = 2 * np.pi / wavelength +k1 = k0 +k2 = k0 opt_max_eval = 250 -unit_cell_pitch = 400e-9 #equivalent to spatial sampling +unit_cell_pitch = 700e-9 #equivalent to spatial sampling Nx = 2048 #pixels per dimension Ny = Nx @@ -41,9 +53,9 @@ rho = np.sqrt(X**2 + Y**2) sampling_period = xs[1] - xs[0] -d0 = 345e-6 #propagation distance: source - MS1 +d0 = 300e-6 #propagation distance: source - MS1 d1 = 500e-6 #propagation distance: MS1 - MS2 -d2 = 500e-6 #propagation distance: MS2 - target +d2 = 400e-6 #propagation distance: MS2 - target d = [d1, d2] #d = [d1,d2] d1:distance MS1-MS2, d2: distance MS2-target phase_min = 0 @@ -52,7 +64,9 @@ phase_max = 2 * np.pi ############################## #Source -beam_waist = 9e-6 +beam_waist = 5.2e-6 +#output fibre +output_fiber_core_diameter = 19e-6 ############################## ############################## @@ -92,8 +106,12 @@ P_2_dagger_nat = np.fft.ifftshift(P_2).T.conj() ############################## #Plot zoom parameters [um] -zoom_x = 60*3 -zoom_y = 60*3 +#Plot zoom parameters [um] +zoom_x = 150 +zoom_y = 150 +zoom_output_fiber_radius = 63 +full_view_x = size_x * 1e6 / 2 +full_view_y = size_y * 1e6 / 2 ############################## def phase_given_w(w): @@ -112,81 +130,141 @@ def get_pattern() -> np.ndarray: return pattern.flatten() -def get_fiber_mode_pattern(): - '''Returns the target fiber mode pattern''' - print("Computing target fiber mode pattern...") - lda = 1.55e-6 +def get_fiber_mode_pattern(mode_list:list)->list: + '''Returns the fiber mode pattern for the selected n index. + Args: + mode_list: the list of the selected fiber mode indices + Returns: + The fiber mode patterns corresponding to the selected indices returned + as a list of 2D arrays with the same order as the input mode_list + ''' + #check if the modes in mode_list have already been compute by checking + #the saved files in the 'results' folder. If they have, load them from the files. If not, compute them and save them to the files. + fiber_modes_input_folder = "fiber_modes" + output_patterns = [] + try: + for enum_index, n in enumerate(mode_list): + #try to load mode index n + try: + pattern_file = fiber_modes_input_folder + f"/LP{n}1_field_distribution.npy" + pattern = np.load(pattern_file) + output_patterns.append(pattern) + print("Loaded fiber patterns for mode index: ", n) + #if mode index n was not found, compute it + except FileNotFoundError: + if not os.path.exists(fiber_modes_input_folder): + os.makedirs(fiber_modes_input_folder) - n_co = 1.4630 - n_cl = 1.4585 - a = 6e-6 + print("Computing fiber patterns for mode index: ", n) + lda = 1.55e-6 - #find the v parameter range that corresponds to the 1550 nm wavelength - #v_1550 = 2 * np.pi * a / lda * np.sqrt(n_co**2 - n_cl**2) - v_1550 = 4.5 + n_co = 1.4630 #core refractive index + n_cl = 1.4585 #cladding refractive index - b = np.linspace(1e-3, 1-1e-3, 400000) - V_list = np.linspace(2, 5.1, 20) - V_obs = v_1550 - #b, V = np.meshgrid(b_list, V_list) - n_list = [0,1,2] + fiber_core_diameter = output_fiber_core_diameter # [m] + a = fiber_core_diameter / 2 #fiber core radius - b_solutions_at_V_obs = [] - for n in n_list: - b_solutions = [] - for V in V_list: - LHS = np.sqrt(1-b) * jv(n+1, V * np.sqrt(1-b)) / jv(n, V * np.sqrt(1-b)) - RHS = np.sqrt(b) * kv(n+1, V * np.sqrt(b)) / kv(n, V * np.sqrt(b)) - + #find the v parameter range that corresponds to the 1550 nm wavelength + #v_1550 = 2 * np.pi * a / lda * np.sqrt(n_co**2 - n_cl**2) + v_1550 = 4.5 - intersection_index = np.argmax(np.where(np.isclose(LHS, RHS, atol=0.000001),1,0).flatten()) + b = np.linspace(1e-3, 1-1e-3, 400000) + V_list = np.linspace(2, 5.1, 20) + V_obs = v_1550 + #b, V = np.meshgrid(b_list, V_list) - b_solutions.append(b[intersection_index]) + b_solutions_at_V_obs = [] + b_solutions = [] + for V in V_list: + LHS = np.sqrt(1-b) * jv(n+1, V * np.sqrt(1-b)) / jv(n, V * np.sqrt(1-b)) + RHS = np.sqrt(b) * kv(n+1, V * np.sqrt(b)) / kv(n, V * np.sqrt(b)) - LHS = np.sqrt(1-b) * jv(n+1, V_obs * np.sqrt(1-b)) / jv(n, V_obs * np.sqrt(1-b)) - RHS = np.sqrt(b) * kv(n+1, V_obs * np.sqrt(b)) / kv(n, V_obs * np.sqrt(b)) - b_solutions_at_V_obs.append(b[np.argmax(np.where(np.isclose(LHS, RHS, atol=0.00001),1,0).flatten())]) + intersection_index = np.argmax(np.where(np.isclose(LHS, RHS, atol=0.000001),1,0).flatten()) - n_mode_sel = 2 - b_mode_sel = b_solutions_at_V_obs[n_mode_sel] + b_solutions.append(b[intersection_index]) - k_co = 2 * np.pi / lda * n_co - k_cl = 2 * np.pi / lda * n_cl + LHS = np.sqrt(1-b) * jv(n+1, V_obs * np.sqrt(1-b)) / jv(n, V_obs * np.sqrt(1-b)) + RHS = np.sqrt(b) * kv(n+1, V_obs * np.sqrt(b)) / kv(n, V_obs * np.sqrt(b)) + b_solutions_at_V_obs.append(b[np.argmax(np.where(np.isclose(LHS, RHS, atol=0.00001),1,0).flatten())]) - beta = np.sqrt(b_mode_sel * (k_co**2 - k_cl**2) + k_cl**2) + b_mode_sel = b_solutions_at_V_obs[0] - chi_co = v_1550 * np.sqrt(1 - b_mode_sel) / a - chi_cl = v_1550 * np.sqrt(b_mode_sel) / a + k_co = 2 * np.pi / lda * n_co + k_cl = 2 * np.pi / lda * n_cl - E_field = np.zeros_like(X, dtype=complex) + beta = np.sqrt(b_mode_sel * (k_co**2 - k_cl**2) + k_cl**2) - for i in range(Nx): - for j in range(Ny): - r = np.sqrt(X[i,j]**2 + Y[i,j]**2) - if r < 10*a: - phi = np.arctan2(Y[i,j], X[i,j]) - if r < a:#inside core - E_field[i,j] = jv(n_mode_sel,chi_co * r) / jv(n_mode_sel, chi_co * a) * np.cos(n_mode_sel * phi) - else:#outside core - E_field[i,j] = kv(n_mode_sel, chi_cl * r) / kv(n_mode_sel, chi_cl * a) * np.cos(n_mode_sel * phi) + chi_co = v_1550 * np.sqrt(1 - b_mode_sel) / a + chi_cl = v_1550 * np.sqrt(b_mode_sel) / a - return E_field + E_field = np.zeros_like(X, dtype=complex) -def get_source_field(beam_waist): - '''Returns a normalized Gaussian source field for a given beam waist. Normalization consists in scaling - the field such that its integrated intensity is 1.''' - gaussian_field = np.exp(-rho**2 / (beam_waist)**2) #Gaussian input field, flattened + for i in range(Nx): + for j in range(Ny): + r = np.sqrt(X[i,j]**2 + Y[i,j]**2) + if r < 10*a: + phi = np.arctan2(Y[i,j], X[i,j]) + if r < a:#inside core + E_field[i,j] = jv(n,chi_co * r) / jv(n, chi_co * a) * np.cos(n * phi) + else:#outside core + E_field[i,j] = kv(n, chi_cl * r) / kv(n, chi_cl * a) * np.cos(n * phi) + #save the computed pattern to a file for future use + pattern_file = fiber_modes_input_folder + f"/LP{n}1_field_distribution.npy" + np.save(pattern_file, E_field) + output_patterns.append(E_field) + return output_patterns + except: + raise(Exception("Error in computing fiber patterns")) + +def shift_spatial_grid(shift_amount_x,shift_amount_y): + '''Shifts the simulation spatial grid by a given physical (true space) amount. + Args: + shift_amount_x: amount to shift the grid in x direction (in meters) + shift_amount_y: amount to shift the grid in y direction (in meters) + Returns: + the shifted spatial grid (X, Y)''' + Xp = X + shift_amount_x + Yp = Y + shift_amount_y + return Xp, Yp + +def get_source_field(beam_waist,center_x=0,center_y=0,): + '''Returns a 2D normalized Gaussian source field for a given beam waist and centered at the specified (x,y) coordinates. + Normalization consists in scaling the field such that its integrated intensity is 1. + + Args: + beam_waist: the waist of the Gaussian beam (in meters) + center_x: the x-coordinate of the center of the Gaussian beam (in meters) + center_y: the y-coordinate of the center of the Gaussian beam (in meters) + Returns: + The 2D normalized Gaussian source field. + ''' + + if center_x != 0 or center_y != 0: + X_shifted, Y_shifted = shift_spatial_grid(center_x, center_y) + rho = np.sqrt(X_shifted**2 + Y_shifted**2) + else: + rho = np.sqrt(X**2 + Y**2) + + gaussian_field = np.exp(-(rho)**2 / (beam_waist)**2) #Gaussian input field, flattened gaussian_field_normalized = (gaussian_field / np.sqrt(np.sum(np.abs(gaussian_field)**2))) #normalize the input field to have power = 1 + return gaussian_field_normalized -def propagate_source(): - '''Returns the propagated source field just before metasurface 1 (MS1). This involves propagating the - source for a distance d0: from its plane of definition up to MS1.''' - fft_input_array[:,:] = source_field_2d +def propagate_source(source_to_propagate): + '''Returns the propagated source field (flattened) just before metasurface 1 (MS1). + This involves propagating the source for a distance d0: from its plane of definition up to MS1. + Args: + source_to_propagate: the source field to be propagated (flattened) + Returns: + The propagated source field (flattened) just before MS1. + ''' + + fft_input_array[:,:] = np.fft.ifftshift(source_to_propagate.reshape((Nx, Ny))) fft_operator() ifft_input_array[:,:] = fft_operator.output_array * P_0_nat ifft_operator() - propagated_source_field = ifft_operator.output_array.flatten() + propagated_source_field = np.fft.fftshift(ifft_operator.output_array).flatten() + return propagated_source_field def make_1Dplot_of(x_axis,y_axis,plot_zoom_x=zoom_x,save_name="plot_1D",) -> None: @@ -206,8 +284,8 @@ def make_1Dplot_of(x_axis,y_axis,plot_zoom_x=zoom_x,save_name="plot_1D",) -> Non plt.plot(x_axis[i], y_axis[i]) plt.xlabel("x [um]") plt.tight_layout() - plt.savefig("results/" + save_name + ".pdf") plt.xlim(-plot_zoom_x, plot_zoom_x) + plt.savefig("results/" + save_name + ".pdf") plt.close() def make_2Dplot_of(given_field,choose_quantity="amplitude",save_name="plot",plot_zoom_x=zoom_x,plot_zoom_y=zoom_y) -> None: @@ -242,6 +320,36 @@ def make_2Dplot_of(given_field,choose_quantity="amplitude",save_name="plot",plot plt.savefig("results/" + save_name + ".pdf") plt.close() +def make_polarPlot_of(given_field,choose_quantity="amplitude",save_name="polar_plot",plot_zoom_r=zoom_x) -> None: + '''Makes a polar plot of the given 2D field in a zoomed region. + Saves the plot with the chosen filename to a PDF file. + Args: + given_field: the 2D field to be plotted (flattened) + choose_quantity: either "amplitude" or "phase" to select quantity to plot + save_name: name of the file to save the plot (without extension) + plot_zoom_r: zoom level for the radial axis (in micrometers) + Returns: + None + ''' + fig, ax = plt.subplots(figsize=(6, 6)) + if choose_quantity == "amplitude": + given_field_2d = np.abs(given_field.reshape((Nx, Ny))) #assure the field is 2D before plotting + im = ax.imshow(given_field_2d,origin='lower') + elif choose_quantity == "phase": + given_field_2d = (np.angle(given_field.reshape((Nx, Ny))) + 2*np.pi) % (2*np.pi)#assure the field is 2D before plotting + im = ax.imshow(given_field_2d, cmap='hsv', vmin=0, vmax=2*np.pi) + else: + raise ValueError("choose_quantity must be either 'amplitude' or 'phase'") + + center_x, center_y = Nx//2, Ny//2 + radius = plot_zoom_r * 1e-6 / (size_x/2) * (Nx/2) #convert zoom in um to pixels + circle = patches.Circle((center_x, center_y), radius, transform=ax.transData) + im.set_clip_path(circle) + ax.set_xlim(center_x - radius, center_x + radius) + ax.set_ylim(center_y - radius, center_y + radius) + ax.axis('off') + cbar = plt.colorbar(im, ax=ax) + plt.savefig("results/" + save_name + ".pdf") ########################### #initialize source field source_field = get_source_field(beam_waist) @@ -256,25 +364,26 @@ make_2Dplot_of(source_field_2d, choose_quantity="phase", save_name="source_field ########################### #initialize input field (propagated source field) -input_field = propagate_source() +input_field = propagate_source(source_field) input_field_2d = input_field.reshape((Nx, Ny)) #reshape to 2D for plotting #input field integrated intensity input_field_intensity = np.sum(np.abs(input_field)**2) print("Input field integrated intensity: %.4e" % input_field_intensity) #make a plot and save the input field -make_2Dplot_of(input_field_2d, choose_quantity="amplitude", save_name="input_field_amplitude", plot_zoom_x=zoom_x*2, plot_zoom_y=zoom_y*2) -make_2Dplot_of(input_field_2d, choose_quantity="phase", save_name="input_field_phase", plot_zoom_x=zoom_x*2, plot_zoom_y=zoom_y*2) +make_2Dplot_of(input_field_2d, choose_quantity="amplitude", save_name="input_field_amplitude", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) +make_2Dplot_of(input_field_2d, choose_quantity="phase", save_name="input_field_phase", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) ########################### ########################### #initialize target field -fiber_mode_pattern = get_fiber_mode_pattern() +target_mode_indices = [1] +fiber_mode_pattern = get_fiber_mode_pattern(target_mode_indices) target_Efield_2d = fiber_mode_pattern / np.sqrt(np.sum(np.abs(fiber_mode_pattern)**2)) target_Efield = target_Efield_2d.flatten() #normalized target field (intensity = 1) # Plot: Target field -make_2Dplot_of(target_Efield_2d, choose_quantity="amplitude", save_name="target_field_amplitude", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) -make_2Dplot_of(target_Efield_2d, choose_quantity="phase", save_name="target_field_phase", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) +make_polarPlot_of(target_Efield_2d, choose_quantity="amplitude", save_name="target_field_1_amplitude_polar", plot_zoom_r=zoom_output_fiber_radius) +make_polarPlot_of(target_Efield_2d, choose_quantity="phase", save_name="target_field_1_phase_polar", plot_zoom_r=zoom_output_fiber_radius) ########################### ########################### @@ -282,9 +391,9 @@ make_2Dplot_of(target_Efield_2d, choose_quantity="phase", save_name="target_fiel w_norm = np.zeros((2*S)) #concatenated normalized parameters for both masks X, Y = np.meshgrid(np.linspace(-size_x/2, size_x/2, Nx), np.linspace(-size_y/2, size_y/2, Ny)) rho = np.sqrt(X**2 + Y**2) -circular_mask_1 = np.where(rho.flatten() < 10*6e-6, 0, 0) -w_norm[:S] += circular_mask_1 -target_pattern_phase = (np.angle(target_Efield) + 2 * np.pi) % (2 * np.pi) #make sure the phase is between 0 and 2pi +circular_mask_1 = np.where(rho.flatten() < output_fiber_core_diameter/3, 1, 0) +#w_norm[:S] += circular_mask_1 +target_pattern_phase = (np.angle(target_Efield) + 2 * np.pi) % (2 * np.pi)*circular_mask_1 #make sure the phase is between 0 and 2pi w_norm[S:] += target_pattern_phase / (2 * np.pi) #normalize the target phase to be between 0 and 1 phase_mask = phase_given_w(w_norm) @@ -309,20 +418,20 @@ def forward_propagate() -> None: fft_input_array[:,:] = (input_field * np.exp(1j * phase_mask[:S])).reshape((Nx, Ny)) fft_operator() - print("BEFORE") + #print("BEFORE") fft_power = np.sum(np.abs(fft_operator.output_array)**2)/S non_propagating_mask = np.where((wavelength * nu_parallel)**2 > 1, 0, 1) non_propagating_mask = np.fft.ifftshift(non_propagating_mask) propagating_power = np.sum(np.abs(fft_operator.output_array * non_propagating_mask)**2)/S - print("FFT power: %.4e, Propagating power: %.4e, Non-propagating power: %.4e" % (fft_power, propagating_power, fft_power - propagating_power)) + #print("FFT power: %.4e, Propagating power: %.4e, Non-propagating power: %.4e" % (fft_power, propagating_power, fft_power - propagating_power)) ifft_input_array[:,:] = fft_operator.output_array * P_1_nat #element wise product - print("AFTER") + #print("AFTER") fft_power = np.sum(np.abs(ifft_operator.input_array)**2)/S non_propagating_mask = np.where((wavelength * nu_parallel)**2 > 1, 0, 1) non_propagating_mask = np.fft.ifftshift(non_propagating_mask) propagating_power = np.sum(np.abs(ifft_operator.input_array * non_propagating_mask)**2)/S - print("FFT power: %.4e, Propagating power: %.4e, Non-propagating power: %.4e" % (fft_power, propagating_power, fft_power - propagating_power)) + #print("FFT power: %.4e, Propagating power: %.4e, Non-propagating power: %.4e" % (fft_power, propagating_power, fft_power - propagating_power)) ifft_operator() intermediate_fields[0] = ifft_operator.output_array.copy() @@ -335,10 +444,8 @@ def forward_propagate() -> None: intermediate_fields[1] = ifft_operator.output_array.copy() end_time = time.time() - make_2Dplot_of(intermediate_fields[0], choose_quantity="amplitude", save_name="intermediate_field_after_first_phase_mask_amplitude", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) - make_2Dplot_of(intermediate_fields[0], choose_quantity="phase", save_name="intermediate_field_after_first_phase_mask_phase", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) - make_2Dplot_of(intermediate_fields[1], choose_quantity="amplitude", save_name="intermediate_field_after_second_phase_mask_amplitude", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) - make_2Dplot_of(intermediate_fields[1], choose_quantity="phase", save_name="intermediate_field_after_second_phase_mask_phase", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) + #make_2Dplot_of(intermediate_fields[0], choose_quantity="amplitude", save_name="intermediate_field_1_amplitude", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + #make_2Dplot_of(intermediate_fields[1], choose_quantity="amplitude", save_name="intermediate_field_2_amplitude", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) print("Propagation finished in {:.6f} seconds.".format(end_time - start_time)) @@ -361,13 +468,13 @@ def adjoint_propagate(): ifft_operator() fft_input_array[:,:] = ifft_operator.output_array * Phi_2_dagger - grad_C_phi_2 = 2 * np.real(-1j * intermediate_fields[0].T.conj() * fft_input_array).flatten() + grad_C_phi_2 = 2 * np.real(-1j * intermediate_fields[0].conj() * fft_input_array).flatten() fft_operator() ifft_input_array[:,:] = fft_operator.output_array * P_1_dagger_nat #element wise ifft_operator() - grad_C_phi_1 = 2 * np.real(-1j * input_field_2d.T.conj() * ifft_operator.output_array * Phi_1_dagger).flatten() + grad_C_phi_1 = 2 * np.real(-1j * input_field_2d.conj() * ifft_operator.output_array * Phi_1_dagger).flatten() end_time = time.time() print("Adjoint finished in {:.6f} seconds.".format(end_time - start_time)) @@ -378,8 +485,8 @@ def _compute_cost(): output_field = intermediate_fields[-1].flatten() - circular_mask = np.where(rho.flatten() < 10*6e-6, 1, 0) - C_s = np.abs(np.sum(output_field*circular_mask * np.conj(target_Efield))) ** 2 + #circular_mask = np.where(rho.flatten() < 10*6e-6, 1, 0) + C_s = np.abs(np.sum(output_field * np.conj(target_Efield))) ** 2 C_s = np.real(np.sum(C_s)) C_t = C_s @@ -443,70 +550,37 @@ if __name__ == "__main__": print("Norm. input power: %.4e" % input_power) print("Norm. output power: %.4e" % output_power) + #save the output field for later use - np.savetxt("results/modeconv1_optimized_output_field.txt", output_field.reshape((Nx, Ny))) + save_output_field = False + if save_output_field: + np.savetxt("results/optimized_output_field.txt", output_field.reshape((Nx, Ny))) # Plot results in individual PDF figures # Reshape fields to 2D for visualization output_field_2d = output_field.reshape((Nx, Ny)) phase_mask_1 = phase_given_w(w_norm[:S]).reshape((Nx, Ny)) phase_mask_2 = phase_given_w(w_norm[S:]).reshape((Nx, Ny)) - - a = 6e-6 - d = 10 * a * 1e6 + + phase_mask_zoom = 150 + make_2Dplot_of(phase_mask_1, choose_quantity="phase_mask", save_name="phase_mask_1", plot_zoom_x=phase_mask_zoom, plot_zoom_y=phase_mask_zoom) + make_2Dplot_of(phase_mask_2, choose_quantity="phase_mask", save_name="phase_mask_2", plot_zoom_x=phase_mask_zoom, plot_zoom_y=phase_mask_zoom) # Plot: Output field amplitude and phase - make_2Dplot_of(output_field_2d, choose_quantity="amplitude", save_name="output_field_amplitude", plot_zoom_x=d, plot_zoom_y=d) - make_2Dplot_of(output_field_2d, choose_quantity="phase", save_name="output_field_phase", plot_zoom_x=d, plot_zoom_y=d) + make_polarPlot_of(output_field_2d, choose_quantity="amplitude", save_name="optimized_output_field_amplitude", plot_zoom_r=zoom_output_fiber_radius) + make_polarPlot_of(output_field_2d, choose_quantity="phase", save_name="optimized_output_field_phase", plot_zoom_r=zoom_output_fiber_radius) - phase_mask_zoom = 150 - # Plot: Phase mask 1 - make_2Dplot_of(phase_mask_1, choose_quantity="phase_mask", save_name="phase_mask_1", plot_zoom_x=phase_mask_zoom, plot_zoom_y=phase_mask_zoom) - # Plot: Phase mask 2 - make_2Dplot_of(phase_mask_2, choose_quantity="phase_mask", save_name="phase_mask_2", plot_zoom_x=phase_mask_zoom, plot_zoom_y=phase_mask_zoom) - - # Plot: Cuts along y=0 axis - Amplitude comparison - y_center_idx = Ny // 2 - output_amplitude_cut = np.abs(output_field_2d[y_center_idx, :]) / np.max(np.abs(output_field_2d[y_center_idx, :])) - target_amplitude_cut = np.abs(target_Efield_2d[y_center_idx, :]) / np.max(np.abs(target_Efield_2d[y_center_idx, :])) - - fig, ax = plt.subplots(figsize=(12, 6)) - ax.plot(xs*1e6, output_amplitude_cut, label='Output Field', linewidth=2) - ax.plot(xs*1e6, target_amplitude_cut, label='Target Field', linewidth=2) - ax.set_xlabel('x [um]') - ax.set_xlim(-d,d) - ax.set_ylabel('Amplitude') - ax.set_title('Norm. Field Amplitude along y=0 axis') - ax.legend() - ax.grid(True, alpha=0.3) - plt.tight_layout() - plt.savefig("results/amplitude_cut_comparison.pdf") - plt.close() - - # Plot 8: Cuts along y=0 axis - Phase comparison - output_phase_cut = (np.angle(output_field_2d[y_center_idx, :]) + 2*np.pi) % (2*np.pi) - target_phase_cut = (np.angle(target_Efield_2d[y_center_idx, :]) + 2*np.pi) % (2*np.pi) - x_ax = xs*1e6 - make_1Dplot_of([x_ax, x_ax], [output_phase_cut, target_phase_cut], save_name="phase_cut_comparison") - fig, ax = plt.subplots(figsize=(12, 6)) - ax.plot(xs*1e6, output_phase_cut, label='Output Field', linewidth=2) - ax.plot(xs*1e6, target_phase_cut, label='Target Field', linewidth=2) - ax.set_xlabel('x [um]') - ax.set_ylabel('Phase (rad)') - ax.set_xlim(-d,d) - ax.set_title('Field Phase along y=0 axis') - ax.legend() - ax.grid(True, alpha=0.3) - plt.tight_layout() - plt.savefig("results/phase_cut_comparison.pdf") - plt.close() + slice_y_index = Ny//2 + slice_x = xs * 1e6 + slice_target = target_Efield.reshape((Nx, Ny))[slice_y_index,:] + slice_output = output_field.reshape((Nx, Ny))[slice_y_index,:] + make_1Dplot_of([slice_x, slice_x], [np.abs(slice_target), np.abs(slice_output)], plot_zoom_x=1e6*output_fiber_core_diameter, save_name="modeconv_output_vs_target_amplitude") + make_1Dplot_of([slice_x, slice_x], [(np.angle(slice_target)+2*np.pi)%(2*np.pi), (np.angle(slice_output)+2*np.pi)%(2*np.pi)], plot_zoom_x=1e6*output_fiber_core_diameter, save_name="modeconv_output_vs_target_phase") - # Plot 9: Intermediate field before second phase mask - make_2Dplot_of(intermediate_fields[0], choose_quantity="amplitude", save_name="intermediate_field_amplitude", plot_zoom_x=d, plot_zoom_y=d) - #save the phase masks for later use - np.savetxt("results/optimized_phase_mask_1.txt", phase_mask_1) - np.savetxt("results/optimized_phase_mask_2.txt", phase_mask_2) - - print("All plots saved to results/ folder.") + savePhase_masks = True + if savePhase_masks: + np.savetxt("results/optimized_phase_mask_1.txt", phase_mask_1) + np.savetxt("results/optimized_phase_mask_2.txt", phase_mask_2) + print("All plots saved to results/ folder.") \ No newline at end of file diff --git a/metaprop_fibermode_doublet_epigraph_ego.py b/metaprop_fibermode_doublet_epigraph_ego.py index 17a0823..38170fb 100644 --- a/metaprop_fibermode_doublet_epigraph_ego.py +++ b/metaprop_fibermode_doublet_epigraph_ego.py @@ -25,7 +25,6 @@ from smt.design_space import ( DesignSpace, ) - ############################## #physics and simulation domain wavelength = 1.55e-6 @@ -373,6 +372,7 @@ def make_polarPlot_of(given_field,choose_quantity="amplitude",save_name="polar_p ax.axis('off') cbar = plt.colorbar(im, ax=ax) plt.savefig("results/" + save_name + ".pdf") + plt.close() def shift_spatial_grid(shift_amount_x,shift_amount_y): '''Shifts the spatial grid by a given amount. This is useful for centering the source field on the metasurface. @@ -777,7 +777,4 @@ if __name__ == "__main__": #if the results folder does not exist, create it if not os.path.exists('results'): os.makedirs('results') - - - run_ego() \ No newline at end of file diff --git a/metaprop_fibermode_doublet_multi.py b/metaprop_fibermode_doublet_multi.py index 4bac07e..4bddcc9 100644 --- a/metaprop_fibermode_doublet_multi.py +++ b/metaprop_fibermode_doublet_multi.py @@ -51,7 +51,7 @@ rho = np.sqrt(X**2 + Y**2) sampling_period = xs[1] - xs[0] -d0 = 345-6 #propagation distance: source - MS1 +d0 = 345e-6 #propagation distance: source - MS1 d1 = 500e-6 #propagation distance: MS1 - MS2 d2 = 300e-6 #propagation distance: MS2 - target d = [d1, d2] #d = [d1,d2] d1:distance MS1-MS2, d2: distance MS2-target diff --git a/metaprop_fibermode_doublet_multi_ego.py b/metaprop_fibermode_doublet_multi_ego.py new file mode 100644 index 0000000..29e712a --- /dev/null +++ b/metaprop_fibermode_doublet_multi_ego.py @@ -0,0 +1,798 @@ +import time +import multiprocessing + +import pyfftw +#pyFFTW setup +n_cpu = multiprocessing.cpu_count() +pyfftw.config.NUM_THREADS = n_cpu +pyfftw.interfaces.cache.enable() +pyfftw.config.PLANNER_EFFORT = 'FFTW_MEASURE' + +import nlopt + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.patches as patches +#set the global font size for all plots +plt.rcParams.update({'font.size': 14}) + +from scipy.special import jv, kv + +from smt.applications.ego import EGO, KRG +from smt.sampling_methods import LHS +from smt.design_space import ( + DesignSpace, +) + +import os + +#check results folder exists +if not os.path.exists("results"): + os.makedirs("results") +############################## +#physics and simulation domain +wavelength = 1.55e-6 +k0 = 2 * np.pi / wavelength + +opt_max_eval = 3 + +unit_cell_pitch = 400e-9 #equivalent to spatial sampling + +Nx = 2048 #pixels per dimension +Ny = Nx +S = Nx * Ny + +size_x = unit_cell_pitch * Nx #actual physical size +size_y = unit_cell_pitch * Ny + +xs = np.linspace(-size_x/2, size_x/2 - size_x / Nx, Nx) +ys = np.linspace(-size_y/2, size_y/2 - size_y / Ny, Ny) + +X, Y = np.meshgrid(xs, ys) +rho = np.sqrt(X**2 + Y**2) + +sampling_period = xs[1] - xs[0] + +d = [0, 0, 0] #d = [d1,d2] d1:distance MS1-MS2, d2: distance MS2-target +d0 = d[0] #propagation distance: source - MS1 +d1 = d[1] #propagation distance: MS1 - MS2 +d2 = d[2] #propagation distance: MS2 - target + +phase_min = 0 +phase_max = 2 * np.pi +############################## + +############################## +#Source +beam_waist = 4e-6 +source_spacing = 300e-6 +############################## + +#Plot zoom parameters [um] +zoom_x = 350 +zoom_core_diameter = 2 * 6 +zoom_x_outmode = 12 +zoom_y = 350 +zoom_y_outmode = 50 +full_view_x = size_x * 1e6 / 2 +full_view_y = size_y * 1e6 / 2 +############################## +#PYFFTW PLANNING SETUP +fft_input_array = pyfftw.empty_aligned((Nx, Ny), dtype='complex128', n=16) +fft_output_array = pyfftw.empty_aligned((Nx, Ny), dtype='complex128', n=16) +ifft_input_array = pyfftw.empty_aligned((Nx, Ny), dtype='complex128', n=16) +ifft_output_array = pyfftw.empty_aligned((Nx, Ny), dtype='complex128', n=16) + +fft_operator = pyfftw.FFTW(fft_input_array, fft_output_array, axes=(0,1), direction='FFTW_FORWARD', threads=n_cpu, flags=('FFTW_MEASURE','FFTW_DESTROY_INPUT',)) +ifft_operator = pyfftw.FFTW(ifft_input_array, ifft_output_array, axes=(0,1), direction='FFTW_BACKWARD', threads=n_cpu, flags=('FFTW_MEASURE','FFTW_DESTROY_INPUT',)) +############################## + +############################## +#setting up spatial frequencies +ks = 2 * np.pi / sampling_period +kappas = np.arange(-Nx//2, Nx//2) * ks / Nx +KX, KY = np.meshgrid(kappas, kappas) +K_parallel = np.sqrt(KX**2 + KY**2) +nu_parallel = K_parallel / (2 * np.pi) + +phase_factor_0 = k0 * d[0] * np.sqrt(1 - (wavelength * nu_parallel) ** 2 + 0*1j) +P_0 = np.exp(1j * phase_factor_0) +P_0_nat = np.fft.ifftshift(P_0) +phase_factor_1 = k0 * d[1] * np.sqrt(1 - (wavelength * nu_parallel) ** 2 + 0*1j) +P_1 = np.exp(1j * phase_factor_1) +P_1_nat = np.fft.ifftshift(P_1) +phase_factor_2 = k0 * d[2] * np.sqrt(1 - (wavelength * nu_parallel) ** 2 + 0*1j) +P_2 = np.exp(1j * phase_factor_2) +P_2_nat = np.fft.ifftshift(P_2) + +P_1_dagger = P_1.T.conj() +P_2_dagger = P_2.T.conj() +P_1_dagger_nat = np.fft.ifftshift(P_1).T.conj() +P_2_dagger_nat = np.fft.ifftshift(P_2).T.conj() +############################## +def update_phase_factors(): + phase_factor_0[:,:] = k0 * d[0] * np.sqrt(1 - (wavelength * nu_parallel) ** 2 + 0*1j) + P_0[:,:] = np.exp(1j * phase_factor_0) + P_0_nat[:,:] = np.fft.ifftshift(P_0) + phase_factor_1[:,:] = k0 * d[1] * np.sqrt(1 - (wavelength * nu_parallel) ** 2 + 0*1j) + P_1[:,:] = np.exp(1j * phase_factor_1) + P_1_nat[:,:] = np.fft.ifftshift(P_1) + phase_factor_2[:,:] = k0 * d[2] * np.sqrt(1 - (wavelength * nu_parallel) ** 2 + 0*1j) + P_2[:,:] = np.exp(1j * phase_factor_2) + P_2_nat[:,:] = np.fft.ifftshift(P_2) + + P_1_dagger[:] = P_1.T.conj() + P_2_dagger[:] = P_2.T.conj() + P_1_dagger_nat[:] = np.fft.ifftshift(P_1).T.conj() + P_2_dagger_nat[:] = np.fft.ifftshift(P_2).T.conj() +############################## +def update_input_fields(): + input_field_1[:] = propagate_source(source_field_1) + input_field_1_2d[:] = input_field_1.reshape((Nx, Ny)) #reshape to 2D for plotting + + #initialize input field 2 (propagated source 2 field) + input_field_2[:] = propagate_source(source_field_2) + input_field_2_2d[:] = input_field_2.reshape((Nx, Ny)) #reshape to 2D for plotting + + #input field 1 integrated intensity + input_field_1_intensity = np.sum(np.abs(input_field_1)**2) + print("Input field integrated intensity: %.4e" % input_field_1_intensity) + + #input field 2 integrated intensity + input_field_2_intensity = np.sum(np.abs(input_field_2)**2) + print("Input field integrated intensity: %.4e" % input_field_2_intensity) + + #make a plot and save the input field + make_2Dplot_of(input_field_1_2d, choose_quantity="amplitude", save_name="input_field_1_amplitude", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + make_2Dplot_of(input_field_1_2d, choose_quantity="phase", save_name="input_field_1_phase", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + make_2Dplot_of(input_field_2_2d, choose_quantity="amplitude", save_name="input_field_2_amplitude", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + make_2Dplot_of(input_field_2_2d, choose_quantity="phase", save_name="input_field_2_phase", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) +############################## + +############################## + +def phase_given_w(w): + '''Returns the phase shift given the design parameters w. + Args: + w: design parameters (flattened) + Returns: + The phase shift corresponding to the geometrical parameters w (flattened)''' + #for simplicity, we linearly map w (0,1) to a phase shift (0, 2pi) + return 2 * np.pi * (w) + +def get_pattern() -> np.ndarray: + '''Returns the flattened target fiber mode pattern''' + pattern_name = 'LP11_field_distribution.txt' + pattern = np.loadtxt('misc/' + pattern_name, dtype=complex) + + return pattern.flatten() + +def get_fiber_mode_pattern(mode_list:list)->list: + '''Returns the fiber mode pattern for the selected n index. + Args: + mode_list: the list of the selected fiber mode indices + Returns: + The fiber mode patterns corresponding to the selected indices returned + as a list of 2D arrays with the same order as the input mode_list + ''' + #check if the modes in mode_list have already been compute by checking + #the saved files in the 'results' folder. If they have, load them from the files. If not, compute them and save them to the files. + fiber_modes_input_folder = "fiber_modes" + output_patterns = [] + try: + for enum_index, n in enumerate(mode_list): + #try to load mode index n + try: + pattern_file = fiber_modes_input_folder + f"/LP{n}1_field_distribution.npy" + pattern = np.load(pattern_file) + output_patterns.append(pattern) + print("Loaded fiber patterns for mode index: ", n) + #if mode index n was not found, compute it + except FileNotFoundError: + if not os.path.exists(fiber_modes_input_folder): + os.makedirs(fiber_modes_input_folder) + + print("Computing fiber patterns for mode index: ", n) + lda = 1.55e-6 + + n_co = 1.4630 #core refractive index + n_cl = 1.4585 #cladding refractive index + + fiber_core_diameter = 12e-6 # [m] + a = fiber_core_diameter / 2 #fiber core radius + + #find the v parameter range that corresponds to the 1550 nm wavelength + #v_1550 = 2 * np.pi * a / lda * np.sqrt(n_co**2 - n_cl**2) + v_1550 = 4.5 + + b = np.linspace(1e-3, 1-1e-3, 400000) + V_list = np.linspace(2, 5.1, 20) + V_obs = v_1550 + #b, V = np.meshgrid(b_list, V_list) + + b_solutions_at_V_obs = [] + b_solutions = [] + for V in V_list: + LHS = np.sqrt(1-b) * jv(n+1, V * np.sqrt(1-b)) / jv(n, V * np.sqrt(1-b)) + RHS = np.sqrt(b) * kv(n+1, V * np.sqrt(b)) / kv(n, V * np.sqrt(b)) + + intersection_index = np.argmax(np.where(np.isclose(LHS, RHS, atol=0.000001),1,0).flatten()) + + b_solutions.append(b[intersection_index]) + + LHS = np.sqrt(1-b) * jv(n+1, V_obs * np.sqrt(1-b)) / jv(n, V_obs * np.sqrt(1-b)) + RHS = np.sqrt(b) * kv(n+1, V_obs * np.sqrt(b)) / kv(n, V_obs * np.sqrt(b)) + b_solutions_at_V_obs.append(b[np.argmax(np.where(np.isclose(LHS, RHS, atol=0.00001),1,0).flatten())]) + + b_mode_sel = b_solutions_at_V_obs[0] + + k_co = 2 * np.pi / lda * n_co + k_cl = 2 * np.pi / lda * n_cl + + beta = np.sqrt(b_mode_sel * (k_co**2 - k_cl**2) + k_cl**2) + + chi_co = v_1550 * np.sqrt(1 - b_mode_sel) / a + chi_cl = v_1550 * np.sqrt(b_mode_sel) / a + + E_field = np.zeros_like(X, dtype=complex) + + for i in range(Nx): + for j in range(Ny): + r = np.sqrt(X[i,j]**2 + Y[i,j]**2) + if r < 10*a: + phi = np.arctan2(Y[i,j], X[i,j]) + if r < a:#inside core + E_field[i,j] = jv(n,chi_co * r) / jv(n, chi_co * a) * np.cos(n * phi) + else:#outside core + E_field[i,j] = kv(n, chi_cl * r) / kv(n, chi_cl * a) * np.cos(n * phi) + #save the computed pattern to a file for future use + pattern_file = fiber_modes_input_folder + f"/LP{n}1_field_distribution.npy" + np.save(pattern_file, E_field) + output_patterns.append(E_field) + return output_patterns + except: + raise(Exception("Error in computing fiber patterns")) + +def get_source_field(beam_waist,center_x=0,center_y=0,): + '''Returns a 2D normalized Gaussian source field for a given beam waist and centered at the specified (x,y) coordinates. + Normalization consists in scaling the field such that its integrated intensity is 1. + + Args: + beam_waist: the waist of the Gaussian beam (in meters) + center_x: the x-coordinate of the center of the Gaussian beam (in meters) + center_y: the y-coordinate of the center of the Gaussian beam (in meters) + Returns: + The 2D normalized Gaussian source field. + ''' + + if center_x != 0 or center_y != 0: + X_shifted, Y_shifted = shift_spatial_grid(center_x, center_y) + rho = np.sqrt(X_shifted**2 + Y_shifted**2) + else: + rho = np.sqrt(X**2 + Y**2) + + gaussian_field = np.exp(-(rho)**2 / (beam_waist)**2) #Gaussian input field, flattened + gaussian_field_normalized = (gaussian_field / np.sqrt(np.sum(np.abs(gaussian_field)**2))) #normalize the input field to have power = 1 + + return gaussian_field_normalized + +def propagate_source(source_to_propagate): + '''Returns the propagated source field (flattened) just before metasurface 1 (MS1). + This involves propagating the source for a distance d0: from its plane of definition up to MS1. + Args: + source_to_propagate: the source field to be propagated (flattened) + Returns: + The propagated source field (flattened) just before MS1. + ''' + + fft_input_array[:,:] = np.fft.ifftshift(source_to_propagate.reshape((Nx, Ny))) + fft_operator() + ifft_input_array[:,:] = fft_operator.output_array * P_0_nat + ifft_operator() + propagated_source_field = np.fft.fftshift(ifft_operator.output_array).flatten() + + return propagated_source_field + +def make_1Dplot_of(x_axis,y_axis,plot_zoom_x=zoom_x,save_name="plot_1D",) -> None: + '''Makes a 1D plot of the given data and saves it to a PDF file. + Args: + x_axis: list of x-axis data (list of 1D arrays) + y_axis: list of y-axis data (list of 1D arrays) + plot_zoom_x: zoom level for the x-axis (in micrometers) + save_name: name of the file to save the plot (without extension) + Returns: + None + ''' + if len(x_axis) != len(y_axis): + raise ValueError("Lists x_axis and y_axis must have the same length.") + plt.figure() + for i in range(len(x_axis)): + plt.plot(x_axis[i], y_axis[i]) + plt.xlabel("x [um]") + plt.tight_layout() + plt.savefig("results/" + save_name + ".pdf") + plt.xlim(-plot_zoom_x, plot_zoom_x) + plt.close() + +def make_2Dplot_of(given_field,choose_quantity="amplitude",save_name="plot",plot_zoom_x=zoom_x,plot_zoom_y=zoom_y) -> None: + '''Makes a plot of the given 2D field in a zoomed region. + Saves the plot with the chosen filename to a PDF file. + Args: + given_field: the 2D field to be plotted (flattened) + choose_quantity: either "amplitude" or "phase" to select quantity to plot + save_name: name of the file to save the plot (without extension) + plot_zoom_x: zoom level for the x-axis (in micrometers) + plot_zoom_y: zoom level for the y-axis (in micrometers) + Returns: + None''' + + given_field_2d = given_field.reshape((Nx, Ny)) #assure the field is 2D before plotting + plt.figure() + if choose_quantity == "amplitude": + plt.imshow(np.abs(given_field_2d), extent=(-size_x*1e6/2, size_x*1e6/2, -size_y*1e6/2, size_y*1e6/2)) + elif choose_quantity == "phase": + plt.imshow((np.angle(given_field_2d)+2*np.pi)%(2*np.pi), extent=(-size_x*1e6/2, size_x*1e6/2, -size_y*1e6/2, size_y*1e6/2), cmap='hsv', vmin=0, vmax=2*np.pi) + elif choose_quantity == "phase_mask": + plt.imshow((given_field_2d+2*np.pi)%(2*np.pi), extent=(-size_x*1e6/2, size_x*1e6/2, -size_y*1e6/2, size_y*1e6/2), cmap='hsv', vmin=0, vmax=2*np.pi) + else: + raise ValueError("choose_quantity must be either 'amplitude' or 'phase'") + + plt.xlim(-plot_zoom_x, plot_zoom_x) + plt.ylim(-plot_zoom_y, plot_zoom_y) + plt.xlabel("x [um]") + plt.ylabel("y [um]") + plt.colorbar() + plt.tight_layout() + plt.savefig("results/" + save_name + ".pdf") + plt.close() + +def make_polarPlot_of(given_field,choose_quantity="amplitude",save_name="polar_plot",plot_zoom_r=zoom_x) -> None: + '''Makes a polar plot of the given 2D field in a zoomed region. + Saves the plot with the chosen filename to a PDF file. + Args: + given_field: the 2D field to be plotted (flattened) + choose_quantity: either "amplitude" or "phase" to select quantity to plot + save_name: name of the file to save the plot (without extension) + plot_zoom_r: zoom level for the radial axis (in micrometers) + Returns: + None + ''' + fig, ax = plt.subplots(figsize=(6, 6)) + if choose_quantity == "amplitude": + given_field_2d = np.abs(given_field.reshape((Nx, Ny))) #assure the field is 2D before plotting + im = ax.imshow(given_field_2d,origin='lower') + elif choose_quantity == "phase": + given_field_2d = (np.angle(given_field.reshape((Nx, Ny))) + 2*np.pi) % (2*np.pi)#assure the field is 2D before plotting + im = ax.imshow(given_field_2d, cmap='hsv', vmin=0, vmax=2*np.pi) + else: + raise ValueError("choose_quantity must be either 'amplitude' or 'phase'") + + center_x, center_y = Nx//2, Ny//2 + radius = plot_zoom_r * 1e-6 / (size_x/2) * (Nx/2) #convert zoom in um to pixels + circle = patches.Circle((center_x, center_y), radius, transform=ax.transData) + im.set_clip_path(circle) + ax.set_xlim(center_x - radius, center_x + radius) + ax.set_ylim(center_y - radius, center_y + radius) + ax.axis('off') + cbar = plt.colorbar(im, ax=ax) + plt.savefig("results/" + save_name + ".pdf") + plt.close() + + +def shift_spatial_grid(shift_amount_x,shift_amount_y): + '''Shifts the simulation spatial grid by a given physical (true space) amount. + Args: + shift_amount_x: amount to shift the grid in x direction (in meters) + shift_amount_y: amount to shift the grid in y direction (in meters) + Returns: + the shifted spatial grid (X, Y)''' + Xp = X + shift_amount_x + Yp = Y + shift_amount_y + return Xp, Yp + +########################### +#initialize source field +source_field_1 = get_source_field(beam_waist, center_x=-source_spacing/2, center_y=0) +source_field_2 = get_source_field(beam_waist, center_x=source_spacing/2, center_y=0) + +#source field integrated intensity +source_1_power = np.sum(np.abs(source_field_1)**2) +source_2_power = np.sum(np.abs(source_field_2)**2) +print("Source 1 field integrated intensity: %.4e" % source_1_power) +print("Source 2 field integrated intensity: %.4e" % source_2_power) +#make a plot and save the source field +make_2Dplot_of(source_field_1, choose_quantity="amplitude", save_name="source_1_field_amplitude", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) +make_2Dplot_of(source_field_1, choose_quantity="phase", save_name="source_1_field_phase", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) +make_2Dplot_of(source_field_2, choose_quantity="amplitude", save_name="source_2_field_amplitude", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) +make_2Dplot_of(source_field_2, choose_quantity="phase", save_name="source_2_field_phase", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) +########################### + +########################### +#initialize input field 1 (propagated source 1 field) +input_field_1 = propagate_source(source_field_1) +input_field_1_2d = input_field_1.reshape((Nx, Ny)) #reshape to 2D for plotting + +#initialize input field 2 (propagated source 2 field) +input_field_2 = propagate_source(source_field_2) +input_field_2_2d = input_field_2.reshape((Nx, Ny)) #reshape to 2D for plotting + +#input field 1 integrated intensity +input_field_1_intensity = np.sum(np.abs(input_field_1)**2) +print("Input field integrated intensity: %.4e" % input_field_1_intensity) + +#input field 2 integrated intensity +input_field_2_intensity = np.sum(np.abs(input_field_2)**2) +print("Input field integrated intensity: %.4e" % input_field_2_intensity) + +#make a plot and save the input field +#make_2Dplot_of(input_field_1_2d, choose_quantity="amplitude", save_name="input_field_1_amplitude", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) +#make_2Dplot_of(input_field_1_2d, choose_quantity="phase", save_name="input_field_1_phase", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) +#make_2Dplot_of(input_field_2_2d, choose_quantity="amplitude", save_name="input_field_2_amplitude", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) +#make_2Dplot_of(input_field_2_2d, choose_quantity="phase", save_name="input_field_2_phase", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) + +#list of input fields to be propagated within the optimization loop +input_field_list = [input_field_1, input_field_2] +########################### + +########################### +#initialize target field +target_mode_indices = [1,2] +fiber_mode_pattern_1, fiber_mode_pattern_2 = get_fiber_mode_pattern(target_mode_indices) + +target_Efield_1_2d = fiber_mode_pattern_1 / np.sqrt(np.sum(np.abs(fiber_mode_pattern_1)**2)) +target_Efield_1 = target_Efield_1_2d.flatten() #normalized target field (intensity = 1) + +target_Efield_2_2d = fiber_mode_pattern_2 / np.sqrt(np.sum(np.abs(fiber_mode_pattern_2)**2)) +target_Efield_2 = target_Efield_2_2d.flatten() #normalized target field (intensity = 1) + +# Plot target fields using polar coordinates +make_polarPlot_of(target_Efield_1_2d, choose_quantity="amplitude", save_name="target_field_1_amplitude_polar", plot_zoom_r=zoom_core_diameter) +make_polarPlot_of(target_Efield_1_2d, choose_quantity="phase", save_name="target_field_1_phase_polar", plot_zoom_r=zoom_core_diameter) +make_polarPlot_of(target_Efield_2_2d, choose_quantity="amplitude", save_name="target_field_2_amplitude_polar", plot_zoom_r=zoom_core_diameter) +make_polarPlot_of(target_Efield_2_2d, choose_quantity="phase", save_name="target_field_2_phase_polar", plot_zoom_r=zoom_core_diameter) + +target_field_list = [target_Efield_1, target_Efield_2] +########################### + +def forward_propagate(input_field:np.ndarray,weights:np.ndarray) -> np.ndarray: + '''Propagates the input field through the system. Stores results in-place within the intermediate_fields list. + Returns: + the output field computed at the observation plane + ''' + print("Starting propagating...") + intermediate_fields = [None, None] + start_time = time.time() + phase_mask = phase_given_w(weights) + fft_input_array[:,:] = np.fft.ifftshift((input_field * np.exp(1j * phase_mask[:S])).reshape((Nx, Ny))) + fft_operator() + #print("BEFORE") + fft_power = np.sum(np.abs(fft_operator.output_array)**2)/S + non_propagating_mask = np.where((wavelength * nu_parallel)**2 > 1, 0, 1) + non_propagating_mask = np.fft.ifftshift(non_propagating_mask) + propagating_power = np.sum(np.abs(fft_operator.output_array * non_propagating_mask)**2)/S + #print("FFT power: %.4e, Propagating power: %.4e, Non-propagating power: %.4e" % (fft_power, propagating_power, fft_power - propagating_power)) + + #FIRST PROPAGATION + ifft_input_array[:,:] = fft_operator.output_array * P_1_nat #element wise product + #print("AFTER") + + fft_power = np.sum(np.abs(ifft_operator.input_array)**2)/S + non_propagating_mask = np.where((wavelength * nu_parallel)**2 > 1, 0, 1) + non_propagating_mask = np.fft.ifftshift(non_propagating_mask) + propagating_power = np.sum(np.abs(ifft_operator.input_array * non_propagating_mask)**2)/S + #print("FFT power: %.4e, Propagating power: %.4e, Non-propagating power: %.4e" % (fft_power, propagating_power, fft_power - propagating_power)) + + ifft_operator() + intermediate_fields[0] = np.fft.fftshift(ifft_operator.output_array.copy()) + #print("Field intensity after first phase mask and propagation: %.4e" % np.sum(np.abs(intermediate_fields[0])**2)) + + fft_input_array[:,:] = np.fft.ifftshift((np.fft.fftshift(ifft_operator.output_array) * np.exp(1j * phase_mask[S:].reshape((Nx, Ny))))) + fft_operator() + + #SECOND PROPAGATION + ifft_input_array[:,:] = fft_operator.output_array * P_2_nat #element wise product + ifft_operator() + intermediate_fields[1] = np.fft.fftshift(ifft_operator.output_array.copy()) + + end_time = time.time() + print("Propagation finished in {:.6f} seconds.".format(end_time - start_time)) + + make_2Dplot_of(intermediate_fields[0], choose_quantity="amplitude", save_name="intermediate_field_1_amplitude", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + make_2Dplot_of(intermediate_fields[1], choose_quantity="amplitude", save_name="intermediate_field_2_amplitude", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + + return intermediate_fields + +def adjoint_propagate(input_field_2d,target_Efield_2d,intermediate_fields,input_weights): + '''Backpropagates the output field using the adjoint of the propagation matrix P. + Returns: + the gradients of the cost function with respect to the phase mask parameters (flattened) + ''' + print("Computing adjoint...") + start_time = time.time() + + phase_mask = phase_given_w(input_weights) + Phi_1_dagger = np.exp(-1j * phase_mask[:S]).reshape((Nx, Ny)) + Phi_2_dagger = np.exp(-1j * phase_mask[S:]).reshape((Nx, Ny)) + + #compute the adjoint source + fft_input_array[:,:] = np.fft.ifftshift(np.sum(intermediate_fields[1] * np.conj(target_Efield_2d)) * target_Efield_2d) + fft_operator() + ifft_input_array[:,:] = fft_operator.output_array * P_2_dagger_nat + ifft_operator() + fft_input_array[:,:] = np.fft.ifftshift(np.fft.fftshift(ifft_operator.output_array) * Phi_2_dagger) + + grad_C_phi_2 = 2 * np.real(-1j * intermediate_fields[0].conj() * np.fft.fftshift(fft_input_array)).flatten() + + fft_operator() + ifft_input_array[:,:] = fft_operator.output_array * P_1_dagger_nat #element wise + ifft_operator() + + grad_C_phi_1 = 2 * np.real(-1j * input_field_2d.conj() * np.fft.fftshift(ifft_operator.output_array) * Phi_1_dagger).flatten() + + end_time = time.time() + print("Adjoint finished in {:.6f} seconds.".format(end_time - start_time)) + return np.concatenate((grad_C_phi_1, grad_C_phi_2)) + + +def value_and_grad(weights): + ''' + Returns the value of the cost function and its gradient with respect to the phase mask parameters for + every available set of input/target fields. + Args: + weights: the current phase mask parameters (flattened) + Returns: + values: the value of the cost function for each input/target field pair + gradients: the gradient of the cost function with respect to the phase mask parameters for each input/target field pair + ''' + + values = [] + gradients = [] + + phase_mask[:] = phase_given_w(weights) #update phase mask in place + for i, input_field in enumerate(input_field_list): + + intermediate_fields = forward_propagate(input_field, weights) + + #circular_mask = np.where(rho.flatten() < 10*6e-6, 1, 0) + C_s = np.abs(np.sum(intermediate_fields[-1].flatten() * np.conj(target_field_list[i]))) ** 2 + C = np.real(np.sum(C_s)) + + values.append(C) + gradients.append( + adjoint_propagate( + input_field_2d = input_field.reshape((Nx, Ny)), + target_Efield_2d = target_field_list[i].reshape((Nx, Ny)), + intermediate_fields = intermediate_fields, + input_weights = weights + ) + ) + + return np.array(values), np.array(gradients) + +opt_history = [] +opt_history1 = [] +opt_history2 = [] +def obj_fun(weights, grad): + ''' + Objective function for the optimization. Computes the overall cost function by taking the mean value + of the individual cost functions for each input/target field pair. Also computes the gradient of the overall cost function + with respect to the weights parameters. + Args: + weights: the current normalized phase mask parameters (flattened) + grad: the gradient of the overall cost function with respect to the weights parameters (flattened) + Returns: + average_obj_val: the average value of the cost function across all input/target field pairs + ''' + w_norm[:] = weights + + obj_val, grads = value_and_grad(weights) + average_obj_val = np.mean(obj_val) + + if grads.size > 0: + target_num = len(target_field_list) + + if target_num > 1: + grads_sum = grads[0] + grads[1] + else: + grads_sum = grads[0] + + grad[:] = 1 / target_num * (grads_sum) * 2 * np.pi + #make a plot of the magnitude of the gradient + #make_2Dplot_of(np.abs(grad[S:].reshape((Nx, Ny))), choose_quantity="amplitude", save_name="gradient_magnitude", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + + opt_history.append(average_obj_val) + opt_history1.append(obj_val[0]) + opt_history2.append(obj_val[1]) + make_1Dplot_of([np.arange(len(opt_history))]*3, [opt_history,opt_history1,opt_history2], plot_zoom_x=len(opt_history), save_name="optimization_history") + + return average_obj_val + +def initialize_masks(): + X1,Y1 = shift_spatial_grid(-source_spacing/2,0) + rho1 = np.sqrt(X1**2 + Y1**2) + circular_mask_1 = np.where(rho1.flatten() < 3*beam_waist, 1, 0) + + X2,Y2 = shift_spatial_grid(source_spacing/2,0) + rho2 = np.sqrt(X2**2 + Y2**2) + circular_mask_2 = np.where(rho2.flatten() < 3*beam_waist, 1, 0) + + target_pattern_1_norm_phase = (np.angle(target_Efield_1) + 2 * np.pi) % (2 * np.pi) / (2*np.pi) + target_pattern_1_norm_phase = np.roll(target_pattern_1_norm_phase, shift=int(source_spacing/sampling_period/2), axis=0) + + target_pattern_2_norm_phase = (np.angle(target_Efield_2) + 2 * np.pi) % (2 * np.pi) / (2*np.pi) + target_pattern_2_norm_phase = np.roll(target_pattern_2_norm_phase, shift=-int(source_spacing/sampling_period/2), axis=0) + #on metasurface 1, set initial guess on normalized phase elements + w_norm[:S] += circular_mask_1 * target_pattern_1_norm_phase + circular_mask_2 * target_pattern_2_norm_phase + +#global definitions +w_norm = np.zeros((2*S)) +phase_mask = np.zeros((2*S)) + +def reset_globals(): + #reset global variables before next EGO iteration + opt_history[:] = [] + opt_history1[:] = [] + opt_history2[:] = [] + w_norm[:] = np.zeros((2*S)) + phase_mask[:] = np.zeros((2*S)) + +def metaprop_solve(): + ########################### + #initialize the normalized phase masks and global phase mask + + initialize_masks() + phase_mask[:] = phase_given_w(w_norm) + + #make an initial plot of the phase masks + #make_2Dplot_of(phase_mask[:S].reshape((Nx, Ny)), choose_quantity="phase_mask", save_name="initial_phase_mask_1", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + #make_2Dplot_of(phase_mask[S:].reshape((Nx, Ny)), choose_quantity="phase_mask", save_name="initial_phase_mask_2", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + + #define bounding box for the optimization. The outer mask is fixed to zero phase, while the inner mask can vary between 0 and 2pi phase. + #the bounding box is the outer shell of a square with thickness 100 um + norm_phase_min = 0.0 + norm_phase_max = 1.0 + mask_buffer = 100e-6 + mask_upper_bounds = norm_phase_max * np.where((np.abs(X.flatten()) > size_x/2 - mask_buffer) | (np.abs(Y.flatten()) > size_y/2 - mask_buffer), 0, 1) + mask_upper_bounds = np.concatenate((mask_upper_bounds, mask_upper_bounds),axis=0) + mask_lower_bounds = np.zeros_like(mask_upper_bounds) + + ########################### + + #initialize nlopt solver + solver = nlopt.opt(nlopt.LD_CCSAQ, 2*S) #weights (2S) + epigraph (1) + weights_lower_bounds = mask_lower_bounds.flatten() + weights_upper_bounds = mask_upper_bounds.flatten() + solver.set_lower_bounds(weights_lower_bounds) + solver.set_upper_bounds(weights_upper_bounds) + solver.set_max_objective(obj_fun) + + solver.set_maxeval(opt_max_eval) + solver.set_param("dual_ftol_rel", 1e-7) + solver.set_param("verbosity",1) + + print("Starting optimization...") + start = True + if start: + w_norm[:] = solver.optimize(w_norm) + print("Optimization completed.") + + #verify the results + opt_weights = w_norm + if len(input_field_list) > 1: + verify_out_field_1 = forward_propagate(input_field_list[0], opt_weights)[-1] + verify_out_field_2 = forward_propagate(input_field_list[1], opt_weights)[-1] + + make_polarPlot_of(verify_out_field_1, choose_quantity="amplitude", save_name="modeconv1_optimized_output_field_source1_amplitude", plot_zoom_r=zoom_core_diameter) + make_polarPlot_of(verify_out_field_1, choose_quantity="phase", save_name="modeconv1_optimized_output_field_source1_phase", plot_zoom_r=zoom_core_diameter) + make_polarPlot_of(verify_out_field_2, choose_quantity="amplitude", save_name="modeconv1_optimized_output_field_source2_amplitude", plot_zoom_r=zoom_core_diameter) + make_polarPlot_of(verify_out_field_2, choose_quantity="phase", save_name="modeconv1_optimized_output_field_source2_phase", plot_zoom_r=zoom_core_diameter) + #make 1D slices of target/output fields to compare + slice_y_index = Ny//2 + slice_x = xs * 1e6 + slice_target_1 = target_Efield_1.reshape((Nx, Ny))[slice_y_index,:] + slice_target_2 = target_Efield_2.reshape((Nx, Ny))[slice_y_index,:] + slice_output_1 = verify_out_field_1.reshape((Nx, Ny))[slice_y_index,:] + slice_output_2 = verify_out_field_2.reshape((Nx, Ny))[slice_y_index,:] + #amplitude and phase target 1 + make_1Dplot_of([slice_x, slice_x], [np.abs(slice_target_1), np.abs(slice_output_1)], plot_zoom_x=zoom_x_outmode, save_name="modeconv1_output_vs_target_source1_amplitude") + make_1Dplot_of([slice_x, slice_x], [(np.angle(slice_target_1)+2*np.pi)%(2*np.pi), (np.angle(slice_output_1)+2*np.pi)%(2*np.pi)], plot_zoom_x=zoom_x_outmode, save_name="modeconv1_output_vs_target_source1_phase") + #amplitude and phase target 2 + make_1Dplot_of([slice_x, slice_x], [np.abs(slice_target_2), np.abs(slice_output_2)], plot_zoom_x=zoom_x_outmode, save_name="modeconv1_output_vs_target_source2_amplitude") + make_1Dplot_of([slice_x, slice_x], [(np.angle(slice_target_2)+2*np.pi)%(2*np.pi), (np.angle(slice_output_2)+2*np.pi)%(2*np.pi)], plot_zoom_x=zoom_x_outmode, save_name="modeconv1_output_vs_target_source2_phase") + + else: + verify_out_field_1 = forward_propagate(input_field_list[0], opt_weights)[-1] + make_2Dplot_of(verify_out_field_1, choose_quantity="amplitude", save_name="modeconv1_optimized_output_field_source1_amplitude", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) + make_2Dplot_of(verify_out_field_1, choose_quantity="phase", save_name="modeconv1_optimized_output_field_source1_phase", plot_zoom_x=zoom_x, plot_zoom_y=zoom_y) + + #make a slice of the target/output fields to compare + slice_y_index = Ny//2 + slice_x = xs * 1e6 + slice_target_1 = target_Efield_1.reshape((Nx, Ny))[slice_y_index,:] + slice_output_1 = verify_out_field_1.reshape((Nx, Ny))[slice_y_index,:] + #amplitude and phase target 1 + make_1Dplot_of([slice_x, slice_x], [np.abs(slice_target_1), np.abs(slice_output_1)], plot_zoom_x=zoom_x_outmode, save_name="modeconv1_output_vs_target_source1_amplitude") + make_1Dplot_of([slice_x, slice_x], [np.angle(slice_target_1), np.angle(slice_output_1)], plot_zoom_x=zoom_x_outmode, save_name="modeconv1_output_vs_target_source1_phase") + + #save the output fields for later use + saveFields = False + if saveFields: + np.savetxt("results/modeconv1_optimized_output_field_source1.txt", verify_out_field_1.reshape((Nx, Ny))) + np.savetxt("results/modeconv1_optimized_output_field_source2.txt", verify_out_field_2.reshape((Nx, Ny))) + + # Reshape fields to 2D for visualization + phase_mask_1 = phase_given_w(opt_weights[:S]).reshape((Nx, Ny)) + phase_mask_2 = phase_given_w(opt_weights[S:]).reshape((Nx, Ny)) + # Plot: Phase masks + make_2Dplot_of(phase_mask_1, choose_quantity="phase_mask", save_name="phase_mask_1", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + make_2Dplot_of(phase_mask_2, choose_quantity="phase_mask", save_name="phase_mask_2", plot_zoom_x=full_view_x, plot_zoom_y=full_view_y) + + #save the phase masks for later use + saveMasks = False + if saveMasks: + np.savetxt("results/optimized_phase_mask_1.txt", phase_mask_1) + np.savetxt("results/optimized_phase_mask_2.txt", phase_mask_2) + + print("All plots saved to results/ folder.") + +def metaprop(x): + if not os.path.exists('results/metaprop_results.txt'): + with open('results/metaprop_results.txt', 'w') as f: + f.write("d1 [m] d2 [m] d3 [m] ob1 ob2 t\n") + + m, n = x.shape + C = np.zeros((m,1)) + for i in range(m): + for j in range(n): + d[j] = 1e-6*np.round(x[i,j]) #update the global propagation distances with the new design parameters + + print("Current propagation distances: ", d) + update_phase_factors() #update the phase factors for the new propagation distances + update_input_fields() + print("USING D=",d) + metaprop_solve() #solve the inner optimization problem for the given design parameters + + ob1 = opt_history1[-1] + ob2 = opt_history2[-1] + avg = opt_history[-1] + #save all the partial results for a specific set of design parameters x to a text file + #in append mode, so that we can keep track of the optimization history + with open('results/metaprop_results.txt', 'a') as f: + f.write(f"{d[0]:.6e} {d[1]:.6e} {d[2]:.6e} {ob1:.6e} {ob2:.6e} {avg:.6e}\n") + + alpha = 0.5 + C[i] = -1*avg + alpha * np.abs(ob1 - ob2) #cost function to be minimized by EGO + + reset_globals() + return C + +def run_ego(): + ############################## + #EGO setup + ############################## + n_ego_iter = 30 + xlimits = np.array([[200,700], [200,700], [200,700]]) + seed = 777 + design_space = DesignSpace(xlimits, seed=seed) + criterion = 'EI' + ndoe = 20 + + #build DOE + sampling = LHS(xlimits=xlimits, seed=seed) + xdoe = sampling(ndoe) + + sm = KRG(design_space=design_space, n_start=25, print_global=False) + ego = EGO( + n_iter=n_ego_iter, + criterion=criterion, + xdoe=xdoe, + surrogate=sm, + n_start=25, + ) + + x_opt, y_opt, ind_best, x_data, y_data = ego.optimize(fun=metaprop) + #save the optimization results to a text file + np.savetxt('results/ego_opt_results.txt', np.hstack((x_opt,y_opt))) + +if __name__ == "__main__": + run_ego() \ No newline at end of file diff --git a/unit_cell_meep.ipynb b/unit_cell_meep.ipynb index 23b0a68..2a72e0b 100644 --- a/unit_cell_meep.ipynb +++ b/unit_cell_meep.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 23, + "execution_count": 86, "id": "094bf901", "metadata": {}, "outputs": [], @@ -12,11 +12,7 @@ "import numpy.matlib\n", "import matplotlib.pyplot as plt\n", "\n", - "resolution = 30 # pixels/um\n", - "\n", - "dpml = 1.0 #PML thickness\n", - "dsub = 3.0 #substrate thickness\n", - "dpad = dsub #passind between cell and PML\n", + "resolution = 120 # pixels/unit length\n", "\n", "wvl_min = 1.5\n", "wvl_max = 1.6\n", @@ -27,6 +23,10 @@ "df = fmax-fmin\n", "nfreq = 10\n", "\n", + "dpml = 1.0 #PML thickness\n", + "dsub = 1.5 + wvl_cen #substrate thickness\n", + "dpad = dsub #passind between cell and PML\n", + "\n", "k_point = mp.Vector3(0,0,0) #used for PBC\n", "\n", "n_si = 3.43 #silicon refractive index\n", @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 87, "id": "35f94716", "metadata": {}, "outputs": [ @@ -45,17 +45,27 @@ "name": "stdout", "output_type": "stream", "text": [ - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", + " block, center = (0,0,0.35)\n", + " size (0.4,0.6,0.7)\n", + " axes (1,0,0), (0,1,0), (0,0,1)\n", + " block, center = (0,0,-2.025)\n", + " size (1e+20,1e+20,4.05)\n", + " axes (1,0,0), (0,1,0), (0,0,1)\n", + " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", + " block, center = (0,0,0.35)\n", + " size (0.4,0.6,0.7)\n", + " axes (1,0,0), (0,1,0), (0,0,1)\n", + " block, center = (0,0,-2.025)\n", + " size (1e+20,1e+20,4.05)\n", " axes (1,0,0), (0,1,0), (0,0,1)\n", " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n" ] }, { "data": { - "image/png": "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zTffpNjYWMrKympy/6xZs9TW44MPPqBx48Z1eL5VVVUUFhZGZsfLqRe/AiksLKRt27apOP7xj3/Qrl27VDRGcbvdNGzYMAoPb/q/M2LEiIbH2wpEGjc3Ly/PEqNU/fvf/zZXIPxCrFixgkaNGkVz586lW2+9lbZv30633347GeHcuXOUlJTU4v74+PiGx/0ZN7eiooJCXaeug8yYMYPef/99ioqKorvuuot+97vfkRmHZpce43FzeQvT+FZcXKzTUlpPp09zb775Zjp06BA9+OCD9NOf/lSdSRQUFFAw9ejRo9WtBJ/uNt6SdHTc3PDwcDEuM10H0etUNzxQL9D+/ftp8eLF9Nvf/paOHj1KTz31FAXL8OHDaevWrWolNT4O+eijj9TXtLQ0011fsAx/TnM/+OCDNh/nU82YmBgtIiIiaKe5e/fuVad527Zta3J/enp6p05zyWI3PU5zAx4I+/vf/64NGjQoaIF4r3l0795d27Bhg1ZaWqo98sgjaqVt3ry5w/NCIJ0IxFc1NTVaWVmZFiy1tbXaY489pvXu3VuLjIzURowYoW3dutWveSGQbzj4P0bv5syGj6H8PW4xEp+BpaamBnSeeLsfRAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgERAgE7B1IbW2tGnpk8uTJlJCQoMZ3Wbp0qdGLZRuWD4QHEtqwYQNduXKFpk6davTi2I7lB1YeOHAg1dTUqC1HdXV10Ee7sjvLB2KFIcOszPKBdJY0LCogEHFYVDDZQWpZWZnaZfhyO3LkSECeE8OiWmgXM3ToUHr11Vd9+tkBAwYE5DmlYVHBZIH06dOHcnJyjF4MMOsuBszHVFsQf+3bt4/q6urUVVVWWVlJO3fuVH/OyMigrl27GryEFqbZwMCBA9scbPjYsWMdnh+GRf2GLbYgx48fN3oRbAvHICBCICBCICBCICBCICBCICBCICBCICBCICBCICBCICBCICBCICBCICBCICBCICBCICBCICCyxUcO9ZJERNFkfpeJqEqneSMQwVtElErmd5SI0nSaN3YxIEIgIMIuRnCvhY5B9IJA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", + "image/png": "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", "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -63,20 +73,42 @@ } ], "source": [ - "P = 0.8 #unit cell pitch\n", - "h = 0.8 #pillar height\n", + "P = 0.7 #unit cell pitch\n", + "h = 0.7 #pillar height\n", "\n", "sim_z_size = dpml + dsub + dpad + dpml\n", "sim_x_size = P\n", "sim_y_size = P\n", "\n", + "major_ax = 0.3 #major axis of the ellipse\n", + "minor_ax = 0.2 #minor axis of the ellipse\n", + "\n", "substrate_geo = mp.Block(\n", " material = si,\n", " size = mp.Vector3(mp.inf, mp.inf, dsub+dpml),\n", " center = mp.Vector3(0,0,-(dsub+dpml)/2),\n", ")\n", "\n", - "source_position = mp.Vector3(0,0,-dsub/2) #source position in the middle of the substrate\n", + "ellipse_geo = mp.Ellipsoid(\n", + " size = mp.Vector3(major_ax, minor_ax, 2*dpad),\n", + " center = mp.Vector3(0,0,0),\n", + " material = si,\n", + ")\n", + "ellipse_geo.do_averaging = True\n", + "\n", + "cut_box_1 = mp.Block(\n", + " material = air,\n", + " size = mp.Vector3(major_ax, minor_ax, dpad-h),\n", + " center = mp.Vector3(0,0,(dpad-h)/2+h)\n", + ")\n", + "\n", + "cut_box_2 = mp.Block(\n", + " material = air,\n", + " size = mp.Vector3(major_ax, minor_ax, dpad),\n", + " center = mp.Vector3(0,0,-dpad/2)\n", + ")\n", + "\n", + "source_position = mp.Vector3(0,0,-wvl_cen) #source position in the middle of the substrate\n", "source = mp.Source(\n", " mp.GaussianSource(fcen, fwidth=df),\n", " component = mp.Ex,\n", @@ -87,30 +119,49 @@ "cell_size = mp.Vector3(sim_x_size, sim_y_size, sim_z_size)\n", "pml_layers = [mp.PML(dpml,direction=mp.Z)]\n", "\n", + "def elliptic_cylinder_func(p):\n", + " # p is an mp.Vector3 point (x, y, z)\n", + " if (p.x / (minor_ax/2)) ** 2 + (p.y / (major_ax/2)) ** 2 <= 1.0 and abs(p.z) <= h and abs(p.z) >= 0:\n", + " return si\n", + " return air\n", + "elliptic_cylinder_func.do_averaging = True\n", + "\n", + "test_ell = mp.Block(\n", + " center=mp.Vector3(0, 0, h/2),\n", + " size=mp.Vector3(2*minor_ax, 2*major_ax, h),\n", + " material=elliptic_cylinder_func,\n", + ")\n", + "\n", "sim = mp.Simulation(\n", " resolution = resolution,\n", " cell_size = cell_size,\n", " boundary_layers = pml_layers,\n", " sources = [source],\n", - " geometry = [substrate_geo],\n", + " #geometry = [ ellipse_geo, cut_box_1, cut_box_2, substrate_geo ],\n", + " geometry = [test_ell, substrate_geo],\n", + " material_function = elliptic_cylinder_func,\n", " default_material = air,\n", " k_point = k_point,\n", ")\n", "\n", - "monitor_position = mp.Vector3(0,0,2*h)\n", + "monitor_position = mp.Vector3(0,0,h+wvl_cen)\n", "flux_mon = sim.add_flux(\n", " fcen, df, nfreq, mp.FluxRegion(center=monitor_position, size=mp.Vector3(sim_x_size, sim_y_size, 0))\n", ")\n", "\n", - "f = plt.figure(dpi=120)\n", + "f, ax = plt.subplots(1,2,dpi=120)\n", "yz_plane = mp.Volume(center=mp.Vector3(0,0,0), size=mp.Vector3(0,sim_y_size,sim_z_size))\n", - "sim.plot2D(ax=f.gca(),output_plane=yz_plane,show_sources=True,show_monitors=True)\n", + "xy_plane = mp.Volume(center=mp.Vector3(0,0,h/2), size=mp.Vector3(sim_x_size,sim_y_size,0))\n", + "sim.plot2D(ax=ax[0],output_plane=yz_plane,show_sources=True,show_monitors=True)\n", + "sim.plot2D(ax=ax[1],output_plane=xy_plane,show_sources=True,show_monitors=True,show_epsilon=True)\n", + "ax[1].set_xlim(-sim_x_size/2, sim_x_size/2)\n", + "ax[1].set_ylim(-sim_y_size/2, sim_y_size/2)\n", "plt.show()\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "id": "e2e8c953", "metadata": {}, "outputs": [ @@ -120,81 +171,65 @@ "text": [ "-----------\n", "Initializing structure...\n", - "time for choose_chunkdivision = 5.50747e-05 s\n", + "time for choose_chunkdivision = 0.00579405 s\n", "Working in 3D dimensions.\n", - "Computational cell is 0.8 x 0.8 x 8 with resolution 30\n", - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", + "Computational cell is 0.7 x 0.7 x 8.1 with resolution 120\n", + " block, center = (0,0,0.35)\n", + " size (0.4,0.6,0.7)\n", + " axes (1,0,0), (0,1,0), (0,0,1)\n", + " block, center = (0,0,-2.025)\n", + " size (1e+20,1e+20,4.05)\n", " axes (1,0,0), (0,1,0), (0,0,1)\n", " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - "time for set_epsilon = 0.628286 s\n", - "-----------\n" + "subpixel-averaging is 8.96239% done, 40.9949 s remaining\n", + "subpixel-averaging is 18.719% done, 17.5123 s remaining\n", + "subpixel-averaging is 28.1353% done, 10.2434 s remaining\n", + "subpixel-averaging is 37.5516% done, 6.67275 s remaining\n", + "subpixel-averaging is 47.4217% done, 4.43799 s remaining\n", + "subpixel-averaging is 57.2918% done, 3.01498 s remaining\n", + "subpixel-averaging is 66.9351% done, 1.99351 s remaining\n", + "subpixel-averaging is 77.1455% done, 1.18899 s remaining\n", + "subpixel-averaging is 87.129% done, 0.594217 s remaining\n", + "subpixel-averaging is 96.8857% done, 0.129903 s remaining\n", + "subpixel-averaging is 3.31345% done, 116.772 s remaining\n", + "subpixel-averaging is 6.60798% done, 56.6936 s remaining\n", + "subpixel-averaging is 9.86465% done, 36.645 s remaining\n", + "subpixel-averaging is 13.1592% done, 26.4271 s remaining\n", + "subpixel-averaging is 16.4727% done, 20.3888 s remaining\n", + "subpixel-averaging is 19.7483% done, 16.3062 s remaining\n", + "subpixel-averaging is 23.0807% done, 13.3563 s remaining\n", + "subpixel-averaging is 26.3373% done, 11.2352 s remaining\n", + "subpixel-averaging is 29.5751% done, 9.54566 s remaining\n", + "subpixel-averaging is 32.9075% done, 8.18746 s remaining\n", + "subpixel-averaging is 35.8044% done, 120.738 s remaining\n", + "subpixel-averaging is 35.8233% done, 109.194 s remaining\n" ] }, { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1a93423b9f4b4eee80e61891413698bd", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0, description='0% done ', max=340.0)" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Meep progress: 15.25/340.0 = 4.5% done in 4.0s, 85.3s to go\n", - "on time step 916 (time=15.2667), 0.00437052 s/step\n", - "Meep progress: 32.083333333333336/340.0 = 9.4% done in 8.0s, 76.8s to go\n", - "on time step 1928 (time=32.1333), 0.0039538 s/step\n", - "Meep progress: 48.85/340.0 = 14.4% done in 12.0s, 71.6s to go\n", - "on time step 2935 (time=48.9167), 0.00397708 s/step\n", - "Meep progress: 64.48333333333333/340.0 = 19.0% done in 16.0s, 68.4s to go\n", - "on time step 3875 (time=64.5833), 0.0042569 s/step\n", - "Meep progress: 78.6/340.0 = 23.1% done in 20.0s, 66.6s to go\n", - "on time step 4721 (time=78.6833), 0.00473252 s/step\n", - "Meep progress: 94.3/340.0 = 27.7% done in 24.0s, 62.6s to go\n", - "on time step 5662 (time=94.3667), 0.00425366 s/step\n", - "Meep progress: 114.58333333333333/340.0 = 33.7% done in 28.0s, 55.1s to go\n", - "on time step 6883 (time=114.717), 0.00327709 s/step\n", - "Meep progress: 134.55/340.0 = 39.6% done in 32.0s, 48.9s to go\n", - "on time step 8083 (time=134.717), 0.0033351 s/step\n", - "Meep progress: 155.18333333333334/340.0 = 45.6% done in 36.0s, 42.9s to go\n", - "on time step 9320 (time=155.333), 0.00323422 s/step\n", - "Meep progress: 176.7/340.0 = 52.0% done in 40.0s, 37.0s to go\n", - "on time step 10612 (time=176.867), 0.00309666 s/step\n", - "Meep progress: 197.58333333333334/340.0 = 58.1% done in 44.0s, 31.7s to go\n", - "on time step 11865 (time=197.75), 0.0031939 s/step\n", - "Meep progress: 217.29999999999998/340.0 = 63.9% done in 48.0s, 27.1s to go\n", - "on time step 13049 (time=217.483), 0.00337966 s/step\n", - "Meep progress: 238.48333333333332/340.0 = 70.1% done in 52.0s, 22.1s to go\n", - "on time step 14321 (time=238.683), 0.00314601 s/step\n", - "Meep progress: 259.48333333333335/340.0 = 76.3% done in 56.0s, 17.4s to go\n", - "on time step 15580 (time=259.667), 0.00317825 s/step\n", - "Meep progress: 282.55/340.0 = 83.1% done in 60.0s, 12.2s to go\n", - "on time step 16965 (time=282.75), 0.00288876 s/step\n", - "Meep progress: 305.81666666666666/340.0 = 89.9% done in 64.0s, 7.2s to go\n", - "on time step 18361 (time=306.017), 0.00286804 s/step\n", - "Meep progress: 322.8/340.0 = 94.9% done in 68.0s, 3.6s to go\n", - "on time step 19377 (time=322.95), 0.00393708 s/step\n", - "run 0 finished at t = 340.0 (20400 timesteps)\n" + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[87]\u001b[39m\u001b[32m, line 47\u001b[39m, in \u001b[36melliptic_cylinder_func\u001b[39m\u001b[34m(p)\u001b[39m\n\u001b[32m---> \u001b[39m\u001b[32m47\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m elliptic_cylinder_func(p):\n\u001b[32m 48\u001b[39m \u001b[38;5;66;03m# p is an mp.Vector3 point (x, y, z)\u001b[39;00m\n\u001b[32m 49\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (p.x / (minor_ax/\u001b[32m2\u001b[39m)) ** \u001b[32m2\u001b[39m + (p.y / (major_ax/\u001b[32m2\u001b[39m)) ** \u001b[32m2\u001b[39m <= \u001b[32m1.0\u001b[39m \u001b[38;5;28;01mand\u001b[39;00m abs(p.z) <= h \u001b[38;5;28;01mand\u001b[39;00m abs(p.z) >= \u001b[32m0\u001b[39m:\n\u001b[32m 50\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m si\n", + "\u001b[31mKeyboardInterrupt\u001b[39m: " ] }, { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "RuntimeError", + "evalue": "meep: Error in typemaps", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mRuntimeError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[88]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m 1\u001b[39m obs_point = monitor_position\n\u001b[32m 2\u001b[39m stop_cond = mp.stop_when_fields_decayed(\u001b[32m25\u001b[39m, mp.Ex, obs_point, \u001b[32m1e-6\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m sim.run(until_after_sources=stop_cond)\n\u001b[32m 4\u001b[39m eps_data = sim.get_array(center=mp.Vector3(), size=mp.Vector3(\u001b[32m0\u001b[39m,sim_y_size,sim_z_size), component=mp.Dielectric)\n\u001b[32m 5\u001b[39m ex_data = sim.get_array(center=mp.Vector3(), size=mp.Vector3(\u001b[32m0\u001b[39m,sim_y_size,sim_z_size), component=mp.Ex)\n\u001b[32m 6\u001b[39m plt.figure()\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/mp/lib/python3.13/site-packages/meep/simulation.py:4553\u001b[39m, in \u001b[36mSimulation.run\u001b[39m\u001b[34m(self, *step_funcs, **kwargs)\u001b[39m\n\u001b[32m 4550\u001b[39m until_after_sources = kwargs.pop(\u001b[33m\"\u001b[39m\u001b[33muntil_after_sources\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 4552\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.fields \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m4553\u001b[39m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43minit_sim\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 4555\u001b[39m \u001b[38;5;28mself\u001b[39m._evaluate_dft_objects()\n\u001b[32m 4556\u001b[39m \u001b[38;5;28mself\u001b[39m._check_material_frequencies()\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/mp/lib/python3.13/site-packages/meep/simulation.py:2482\u001b[39m, in \u001b[36mSimulation.init_sim\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 2479\u001b[39m warnings.warn(eps_warning, \u001b[38;5;167;01mRuntimeWarning\u001b[39;00m)\n\u001b[32m 2481\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.structure \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m2482\u001b[39m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_init_structure\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mk_point\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 2484\u001b[39m \u001b[38;5;28mself\u001b[39m.fields = mp.fields(\n\u001b[32m 2485\u001b[39m \u001b[38;5;28mself\u001b[39m.structure,\n\u001b[32m 2486\u001b[39m \u001b[38;5;28mself\u001b[39m.m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.is_cylindrical \u001b[38;5;28;01melse\u001b[39;00m \u001b[32m0\u001b[39m,\n\u001b[32m (...)\u001b[39m\u001b[32m 2491\u001b[39m \u001b[38;5;28mself\u001b[39m.bfast_scaled_k,\n\u001b[32m 2492\u001b[39m )\n\u001b[32m 2494\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.force_all_components \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m.dimensions != \u001b[32m1\u001b[39m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/mp/lib/python3.13/site-packages/meep/simulation.py:2095\u001b[39m, in \u001b[36mSimulation._init_structure\u001b[39m\u001b[34m(self, k)\u001b[39m\n\u001b[32m 2057\u001b[39m \u001b[38;5;28mself\u001b[39m.gv = gv\n\u001b[32m 2058\u001b[39m \u001b[38;5;28mself\u001b[39m.structure = mp.create_structure(\n\u001b[32m 2059\u001b[39m \u001b[38;5;28mself\u001b[39m.cell_size,\n\u001b[32m 2060\u001b[39m \u001b[38;5;28mself\u001b[39m.dft_data_list,\n\u001b[32m (...)\u001b[39m\u001b[32m 2093\u001b[39m ),\n\u001b[32m 2094\u001b[39m )\n\u001b[32m-> \u001b[39m\u001b[32m2095\u001b[39m \u001b[38;5;28mself\u001b[39m.geps = \u001b[30;43mmp\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_set_materials\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 2096\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mstructure\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2097\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mcell_size\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2098\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mgv\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2099\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43meps_averaging\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2100\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msubpixel_tol\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2101\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msubpixel_maxeval\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2102\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mgeometry\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2103\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mgeometry_center\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2104\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mensure_periodicity\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mand\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mnot\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mnot\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mk_point\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2105\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mdefault_material\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2106\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mabsorbers\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2107\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mextra_materials\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2108\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43msplit_chunks_evenly\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2109\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43;01mTrue\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2110\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43;01mNone\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2111\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43;01mFalse\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2112\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43;01mNone\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 2113\u001b[39m \u001b[30;43m\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 2115\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._output_stats \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 2116\u001b[39m sys.exit(\u001b[32m0\u001b[39m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/miniconda3/envs/mp/lib/python3.13/site-packages/meep/__init__.py:4430\u001b[39m, in \u001b[36m_set_materials\u001b[39m\u001b[34m(s, cell_size, gv, use_anisotropic_averaging, tol, maxeval, gobj_list, center, _ensure_periodicity, _default_material, alist, extra_materials, split_chunks_evenly, set_materials, existing_geps, output_chunk_costs, my_bp)\u001b[39m\n\u001b[32m 4429\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_set_materials\u001b[39m(s, cell_size, gv, use_anisotropic_averaging, tol, maxeval, gobj_list, center, _ensure_periodicity, _default_material, alist, extra_materials, split_chunks_evenly, set_materials, existing_geps, output_chunk_costs, my_bp):\n\u001b[32m-> \u001b[39m\u001b[32m4430\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43m_meep\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_set_materials\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43ms\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mcell_size\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mgv\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43muse_anisotropic_averaging\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mtol\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mmaxeval\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mgobj_list\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mcenter\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m_ensure_periodicity\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m_default_material\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43malist\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mextra_materials\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43msplit_chunks_evenly\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mset_materials\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mexisting_geps\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43moutput_chunk_costs\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mmy_bp\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", + "\u001b[31mRuntimeError\u001b[39m: meep: Error in typemaps" + ] } ], "source": [ @@ -211,12 +246,13 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "id": "74c01e55", "metadata": {}, "outputs": [], "source": [ - "input_flux = mp.get_fluxes(flux_mon)" + "input_flux = mp.get_fluxes(flux_mon)\n", + "plt.plot(np.array(input_flux)/np.max(input_flux))" ] }, { @@ -224,480 +260,7 @@ "execution_count": null, "id": "93cee842", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", - " axes (1,0,0), (0,1,0), (0,0,1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - " cylinder, center = (0,0,0.4)\n", - " radius 0.05, height 0.8, axis (0, 0, 1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIgAAAIJCAYAAAB+yXUGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAG5JJREFUeJzt3Ql0VPXZx/EnQ1aSIgRSIGwSkSUJi1YpS09RKpg3qEHnRN8UKAeMyKr0VNoq1KAFGm09rbJjKtKwvizymgKKnhCsbWMti3VI3yMaQCRHJBIhpAUG8n/P868Tsz5JJnPnLvP7nDOdZCZz5/bOl3vv3BnvP0wppQigCa6m7gBAINAsrEFAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEAgNAPJy8ujsLAwiouLM3tWbC3MiR/WnTlzhlJSUig2NpYuXLhAly5dMnuWbMuRgdx777167REfH087duxAIG3guE3Mxo0b6eDBg7Rq1SqzZ8URwslBvvjiC5o/fz7l5uZSz549W/yYc+fO1bnt4sWL9NFHH9HgwYMpKiqKrO7KlSt0+vRpGjNmDHXs2DGwE1cO4na71ahRo1R1dbX+ferUqSo2NlZ8TE5ODm9iHXHZvXt3wJepY9YgO3fupIKCAjpy5Ije/2ip2bNnU2ZmZp3bSkpK6MEHH6Tbb79d7+gGiyJFJT1L6FyHc5RwMYGSP0umMGr+/0txp2K6/Npl6tWrV8DnyRGB8LuUOXPm0Lx58ygxMZG++uorffvVq1f1Nf8eERHR6Iv97W9/W18ak5ubSwMGDKBg8FZ7ad6BeXTuxDm6p+89tPzO5RThimjRY0cvH02n6JQxm0PlACdOnGh29ZuRkdHi6Xk8Hv0Yj8ejguHqtasq838yFS0mfc2/t0bSwiTD5tcRa5Bu3brRgQMHGl0D8Duaffv2UZcuXciKvNe9NGnXJNpesp0ykzNp0wObKKJdy9YcweCIQKKjo+mOO+5ocPurr75K7dq1a/S+lvB6vTWbKaPimPr6VNr5fzvJPdBN6+9ZT+q6oqvXjXvOkAzEKBERERQZGWlYHNP+d5qOw4prDsceKKu/BrHiYXavxTcrIROIFXltFAdDIEHktVkcDIEEideGcTAEEgRem8bBEIjBvDaOgyEQA3ltHgdDIAbxOiAOhkAM4HVIHAyBBJjXQXEwBBJAXofFwRBIgHgdGAdDIAHgdWgcDIG0kdfBcTAE0gZeh8fBEIifvCEQB0MgfvCGSBwMgbSSN4TiYAikFbwhFgdDIC3kDcE4GAJpAW+IxsEQiM3j8F730tmqs4ZNH4HYPI5JuyZR1dUqw54D/12M4Gdv/4z2V+63dBwcb2xkLFWRMZFgDSLY/4n14+D56xrb1bDnQiCC8TeNt3wcPH9GQiCC5+56zvJxGD1/CEQQEeJxMARiA14T300hEIvzmvxWG4FYmNcCx2EQiEV5LRAHQyAW5LVIHAyBWIzXQnEwBGIhXovFwRCIRXgtGAdDIBbgtWgcDIGYzGvhOBgCMZHX4nEwBGISrw3iYAjEBF6bxMEQSJB5bRQHQyBB5LVZHI4J5OjRozRhwgTq3bs3xcTE6MEMR44cqcevswqvDeNwzJeWecAgHm0pKyuLevToQVVVVbRp0yaaMmUKnTx5khYtWmTq/HltGoemHOy73/2u6tWrV6sfF8gBha62cbAgswcUcsQmpik8iFB4uHkrSa+d1xxO2sT4VFdX60tFRQVt376d3nzzTVqxYoUp8+J1QByOC4RHsFy7dq3+mQcCeumll+jRRx9t9bi5H3/8sb6+b8t9FJ0Y3er54MHMz1SeoYtXLlKHqA7k+cJDw9YOI6N8euFTw6btqECeeuopys7O1i86D5E6d+5cvcP6xBNPNPkYHqH7mWeeCeh8hIWFUc8OLRvYORB639CbSqnUkGmH8Y4IOdSsWbMoLy+PysrKKCEhoVVrkIkTJ5LH46GUlBSyumPHjlFqaqoh8+uoNUh9w4cPpzVr1lBpaWmTgUjj5oJDDpQ1hYdKdblclJSUZPas2JYj1iAzZsygDh066DVG165dqby8XL+L2bZtGy1YsKDJtQeESCB8WH39+vW0YcMGfVQ1Li6Ohg4dSvn5+TR58mSzZ8/WHBHItGnT9AUCz9H7INB2CARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECAQQCPgPaxAQIRBwfiCFhYU0ffp0GjhwIMXGxuqhUTMyMujQoUNmz5rtOSKQ1atX6/FxH3/8cdq7dy+9+OKLeiSpESNG6HggxEd7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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-----------\n", - "Initializing structure...\n", - "time for choose_chunkdivision = 8.60691e-05 s\n", - "Working in 3D dimensions.\n", - "Computational cell is 0.8 x 0.8 x 8 with resolution 30\n", - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", - " axes (1,0,0), (0,1,0), (0,0,1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - " cylinder, center = (0,0,0.4)\n", - " radius 0.05, height 0.8, axis (0, 0, 1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - "time for set_epsilon = 0.721498 s\n", - "-----------\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "c0ddf3b68b5245c985a25fc283581a42", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0, description='0% done ', max=300.00023999999394)" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Meep progress: 10.366666666666667/300.00023999999394 = 3.5% done in 4.0s, 111.9s to go\n", - "on time step 623 (time=10.3833), 0.00642495 s/step\n", - "Meep progress: 26.333333333333332/300.00023999999394 = 8.8% done in 8.0s, 83.2s to go\n", - "on time step 1582 (time=26.3667), 0.00417335 s/step\n", - "Meep progress: 44.53333333333333/300.00023999999394 = 14.8% done in 12.0s, 68.9s to go\n", - "on time step 2674 (time=44.5667), 0.00366696 s/step\n", - "Meep progress: 63.233333333333334/300.00023999999394 = 21.1% done in 16.0s, 59.9s to go\n", - "on time step 3798 (time=63.3), 0.00355943 s/step\n", - "Meep progress: 81.88333333333333/300.00023999999394 = 27.3% done in 20.0s, 53.3s to go\n", - "on time step 4918 (time=81.9667), 0.00357388 s/step\n", - "Meep progress: 99.96666666666667/300.00023999999394 = 33.3% done in 24.0s, 48.0s to go\n", - "on time step 6002 (time=100.033), 0.00369273 s/step\n", - "Meep progress: 116.23333333333333/300.00023999999394 = 38.7% done in 28.0s, 44.3s to go\n", - "on time step 6979 (time=116.317), 0.00409807 s/step\n", - "Meep progress: 131.96666666666667/300.00023999999394 = 44.0% done in 32.0s, 40.8s to go\n", - "on time step 7921 (time=132.017), 0.00425162 s/step\n", - "Meep progress: 145.25/300.00023999999394 = 48.4% done in 36.0s, 38.4s to go\n", - "on time step 8720 (time=145.333), 0.00500731 s/step\n", - "Meep progress: 161.81666666666666/300.00023999999394 = 53.9% done in 40.0s, 34.2s to go\n", - "on time step 9714 (time=161.9), 0.00402783 s/step\n", - "Meep progress: 179.98333333333332/300.00023999999394 = 60.0% done in 44.0s, 29.4s to go\n", - "on time step 10804 (time=180.067), 0.00367314 s/step\n", - "Meep progress: 194.21666666666667/300.00023999999394 = 64.7% done in 48.0s, 26.2s to go\n", - "on time step 11658 (time=194.3), 0.00468812 s/step\n", - "Meep progress: 208.6/300.00023999999394 = 69.5% done in 52.0s, 22.8s to go\n", - "on time step 12522 (time=208.7), 0.00463452 s/step\n", - "Meep progress: 223.85/300.00023999999394 = 74.6% done in 56.0s, 19.1s to go\n", - "on time step 13438 (time=223.967), 0.00437009 s/step\n", - "Meep progress: 238.01666666666665/300.00023999999394 = 79.3% done in 60.0s, 15.6s to go\n", - "on time step 14289 (time=238.15), 0.00470161 s/step\n", - "Meep progress: 252.38333333333333/300.00023999999394 = 84.1% done in 64.0s, 12.1s to go\n", - "on time step 15152 (time=252.533), 0.00464055 s/step\n", - "Meep progress: 266.85/300.00023999999394 = 88.9% done in 68.0s, 8.5s to go\n", - "on time step 16023 (time=267.05), 0.00459519 s/step\n", - "Meep progress: 283.43333333333334/300.00023999999394 = 94.5% done in 72.0s, 4.2s to go\n", - "on time step 17016 (time=283.6), 0.00402965 s/step\n", - "run 0 finished at t = 300.01666666666665 (18001 timesteps)\n", - "MPB solved for frequency_1(0,0,625000) = 625000 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,624999.999997)\n", - "MPB solved for frequency_1(0,0,629630) = 629630 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,629629.629626)\n", - "MPB solved for frequency_1(0,0,634259) = 634259 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,634259.259256)\n", - "MPB solved for frequency_1(0,0,638889) = 638889 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,638888.888886)\n", - "MPB solved for frequency_1(0,0,643519) = 643519 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,643518.518515)\n", - "MPB solved for frequency_1(0,0,648148) = 648148 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,648148.148145)\n", - "MPB solved for frequency_1(0,0,652778) = 652778 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,652777.777774)\n", - "MPB solved for frequency_1(0,0,657407) = 657407 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,657407.407404)\n", - "MPB solved for frequency_1(0,0,662037) = 662037 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,662037.037034)\n", - "MPB solved for frequency_1(0,0,666667) = 666667 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,666666.666663)\n", - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", - " axes (1,0,0), (0,1,0), (0,0,1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - " cylinder, center = (0,0,0.4)\n", - " radius 0.15, height 0.8, axis (0, 0, 1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_41021/3049005185.py:42: RuntimeWarning: invalid value encountered in scalar divide\n", - " mode_tran = [abs(coeffs[0,nf,0])**2 / input_flux[nf] for nf in range(nfreq)]\n" - ] - }, - { - "data": { - "image/png": "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IEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgYO9A6urq6Mknn6Tx48dTWlqaGt9l8eLFRi+WbVg+EB5IaN26dXT58mWaOHGi0YtjO5YfebtPnz5UW1urthw86mS4R7uyO8sH4u+QYRBhgQRLGhYVEAitXr2annnmGbRghYPU8vJytcvw5XL06NGQPKYew6Laial2Mf3796eXX37Zp/v27t07JI8pDYsKJguke/fuVFhYaPRigFl3MWA+ptqCBGrfvn1UX1+vzqqyyspK2rFjh/o9NzeXOnXqZPASWphmA3369Gl3sOHjx4/7PT8Mi/oNW2xBTpw4YfQi2BaOQUCEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQEBki48c6iWDiOLJ/L4moiqd5o1ABK8RURaZ3zEiytZp3tjFgAiBgAi7GMG9FjoG0QsCEVTpuOKtArsYECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQsHcgZWVlNH36dBowYAAlJiZSjx49KC8vjw4dOmT0otmC5QNZs2aN+jL/xx57jPbu3UsvvviiGqhwxIgRKh4IkmZxp0+fbnVdXV2d1rVrV+1HP/pRQPPEcCDfsPwWpK3x5pKSkigzM5Oqq6sNWSY7seV/F3PhwgU6fPgwjR07tsP7YtzcDmg2NGnSJC06Olp77733OrxvUVFRu6NVkcUuvGsMNVMFcuDAAZ9XxpEjR9qcx6JFi9TtK1as8PkYhlds08vu3bsNf7LJJIHYatxcHkH7ueeeoyVLltCcOXN8mg/Gze2AZhOLFy9W/4r4Z7DwKuYbtgjk2WefVXHw7iUUEIhJdzGBeOGFF+jpp5+mnJwcmjBhAlVUVDS7nU+YQeAsH0hpaan6+frrr6tLS7yVhAgOpLy83OhFsDXLn0kFfSEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQECEQsHcgR48eVV/iz+PHJCQkUEpKCo0cOZI2btxo9KLZguW/q/38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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-----------\n", - "Initializing structure...\n", - "time for choose_chunkdivision = 7.39098e-05 s\n", - "Working in 3D dimensions.\n", - "Computational cell is 0.8 x 0.8 x 8 with resolution 30\n", - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", - " axes (1,0,0), (0,1,0), (0,0,1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - " cylinder, center = (0,0,0.4)\n", - " radius 0.15, height 0.8, axis (0, 0, 1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - "time for set_epsilon = 0.704258 s\n", - "-----------\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "afccc8c7077249babc34fa8aff572af7", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0, description='0% done ', max=300.00023999999394)" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Meep progress: 13.816666666666666/300.00023999999394 = 4.6% done in 4.0s, 82.9s to go\n", - "on time step 830 (time=13.8333), 0.00482221 s/step\n", - "Meep progress: 28.65/300.00023999999394 = 9.5% done in 8.0s, 75.8s to go\n", - "on time step 1720 (time=28.6667), 0.00449722 s/step\n", - "Meep progress: 43.516666666666666/300.00023999999394 = 14.5% done in 12.0s, 70.8s to go\n", - "on time step 2612 (time=43.5333), 0.00448448 s/step\n", - "Meep progress: 59.55/300.00023999999394 = 19.8% done in 16.0s, 64.7s to go\n", - "on time step 3574 (time=59.5667), 0.00415846 s/step\n", - "Meep progress: 76.35/300.00023999999394 = 25.4% done in 20.0s, 58.6s to go\n", - "on time step 4583 (time=76.3833), 0.00396919 s/step\n", - "Meep progress: 92.7/300.00023999999394 = 30.9% done in 24.0s, 53.7s to go\n", - "on time step 5566 (time=92.7667), 0.00407131 s/step\n", - "Meep progress: 111.8/300.00023999999394 = 37.3% done in 28.0s, 47.2s to go\n", - "on time step 6712 (time=111.867), 0.00349482 s/step\n", - "Meep progress: 130.61666666666667/300.00023999999394 = 43.5% done in 32.0s, 41.5s to go\n", - "on time step 7842 (time=130.7), 0.00354077 s/step\n", - "Meep progress: 149.96666666666667/300.00023999999394 = 50.0% done in 36.0s, 36.0s to go\n", - "on time step 9004 (time=150.067), 0.00344563 s/step\n", - "Meep progress: 168.73333333333332/300.00023999999394 = 56.2% done in 40.0s, 31.1s to go\n", - "on time step 10129 (time=168.817), 0.00355682 s/step\n", - "Meep progress: 187.58333333333334/300.00023999999394 = 62.5% done in 44.0s, 26.4s to go\n", - "on time step 11260 (time=187.667), 0.00353936 s/step\n", - "Meep progress: 206.26666666666665/300.00023999999394 = 68.8% done in 48.0s, 21.8s to go\n", - "on time step 12382 (time=206.367), 0.00356941 s/step\n", - "Meep progress: 223.68333333333334/300.00023999999394 = 74.6% done in 52.0s, 17.8s to go\n", - "on time step 13427 (time=223.783), 0.00383112 s/step\n", - "Meep progress: 239.28333333333333/300.00023999999394 = 79.8% done in 56.0s, 14.2s to go\n", - "on time step 14363 (time=239.383), 0.00427545 s/step\n", - "Meep progress: 255.08333333333334/300.00023999999394 = 85.0% done in 60.0s, 10.6s to go\n", - "on time step 15313 (time=255.217), 0.00421347 s/step\n", - "Meep progress: 271.2833333333333/300.00023999999394 = 90.4% done in 64.0s, 6.8s to go\n", - "on time step 16285 (time=271.417), 0.0041165 s/step\n", - "Meep progress: 288.0833333333333/300.00023999999394 = 96.0% done in 68.0s, 2.8s to go\n", - "on time step 17296 (time=288.267), 0.00395712 s/step\n", - "run 0 finished at t = 300.01666666666665 (18001 timesteps)\n", - "MPB solved for frequency_1(0,0,625000) = 625000 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,624999.999997)\n", - "MPB solved for frequency_1(0,0,629630) = 629630 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,629629.629626)\n", - "MPB solved for frequency_1(0,0,634259) = 634259 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,634259.259256)\n", - "MPB solved for frequency_1(0,0,638889) = 638889 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,638888.888886)\n", - "MPB solved for frequency_1(0,0,643519) = 643519 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,643518.518515)\n", - "MPB solved for frequency_1(0,0,648148) = 648148 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,648148.148145)\n", - "MPB solved for frequency_1(0,0,652778) = 652778 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,652777.777774)\n", - "MPB solved for frequency_1(0,0,657407) = 657407 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,657407.407404)\n", - "MPB solved for frequency_1(0,0,662037) = 662037 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,662037.037034)\n", - "MPB solved for frequency_1(0,0,666667) = 666667 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,666666.666663)\n", - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", - " axes (1,0,0), (0,1,0), (0,0,1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - " cylinder, center = (0,0,0.4)\n", - " radius 0.25, height 0.8, axis (0, 0, 1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n" - ] - }, - { - "data": { - "image/png": "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HpYvX95s1KiMjAy6+uqrafHixTR27FjTls3uHLEFaWlIMR4zJjU1lSorK01ZJqdwxBakJWfOnKH9+/e3ufWQhkUFBwcyZ84cPSTqE088If6eEcOiOokjA/nNb35D69evp6VLl9INN9zQ5mDM2dnZLQ6LCg4MhLcGzz77LC1atEgPrNwWDIsaAgepDeNYuHChvvAo3NBxjgnkmWee0WEsWLCA8vLyzF4cx3DELuaFF16gJ598Up/7mDBhApWWlja6nU+YQQgHUlhYqL++8cYb+tKUUsqEpXIGRwRSUlJi9iI4lmOOQcAYCARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARCI5Camhp69NFHafz48ZSUlERhYWF69AfoGMcEcvLkSVq9ejWdP38eo0UFkCM+zJ/169ePTp8+rbcc1dXVlJ+fb/YiOYJjAuEwIPAcE4i/MCyqLOQDwbCospAPBMOiykI+EAyLGiJPc8EYCARCZxeze/duqq2t1WdVWXl5OW3dulV/n5mZSZ07dzZ5Ce3HUYHMmjWLjh07Vv/zli1b9IUdOXKErrjiig5NXylVf76Fvw/mcKs834bzDtZ5H0cFcvTo0aDO79KlS0GJhGMIDzfnoXJUIMF4oNTlLYfL5aKIiIigzr+urq7RliQYcJDqB2XSSN5mzBdbEB+pBluOTp060dmzZ+nDDz/ULwxGRkbq6/gvPFB4PrwLu3Dhgn77Qnp6OsXHx+vbeD58ezAgkHa4dOlS/QNTWVlJzzzzDBUXF1NCQoJ+huTxeAL2wPDu65tvvqFTp07RLbfcQn/4wx8oNTW12XIYDYH4uYn/5ptv6IMPPtB/4V988QUZ6d///reeX0vLYTQcg/gpPDycEhMTv1+RAf6Lbjg9ng+exdiMy+WiqKio+p+jo6MN2cUwnk+wdilNYRfjJ6VUoyD4+0AG0hBP16xnTtjFgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAiBgAgfQSVQwuexB/sjoZrOr+HPRi6LY7Yg586do/nz51NycrL+QLmhQ4fSpk2bOjTNixcv1n/2WNPPIOPbghUJz4fn5/2+6TJ5b7NEIE8//TS9//77bf5eRUUFTZ8+nYLl7rvvprVr11JeXp4eFmTYsGGUk5NDGzZs6NAnDUZGRtZfGg4nEhMTE7RPHuT58PwYf047L0fD5TL0M+NVO4WFhano6GiVn58v/l5paalyuVwqGHbu3Ml/ymrDhg2Nrh83bpxKTk5WFy9ebNf0ysrK9PTKyspa/Z3PP/9c3XDDDfr3+BIREVH/fSAuDad34403qqqqqg4tr7/8OgbhzfiMGTPoX//6Fy1btizoox409dprr1FcXBxlZ2c3un7atGn0s5/9jN59910aNWpUu6dbUVGhP4Pdizfn/JfMH73N/3berXkFenfTcHo8H/433HTTTfqjub/99ttG65yX0yh+BVJQUKD37xwHf0z0tm3bdDRmKSsro4EDBzb7NOLBgwfX395aINK4uXl5eY12Kw2HAeFRvvnz2r3489MDqeH0eD5PPfUUde3aVUfqHRbEq+HHdAecP7uYd999V3//l7/8RXXu3Fn16NFD7d2717RdzDXXXKNuu+22ZtfzZpn/iYsXL271vnl5eR3aFbhcroDuWjoyfSN2MR06ypoyZQq98847+qOib731VvrjH/9IZpEG2ZFu43FzeQvT8LJjxw6f56sMfiZj1icsB+w8yHXXXUf79u2je++9l375y1/Se++9R/n5+RRM3bp1o5MnTza7nvfXjI8Z/Bk3Nzw8vNW4vE89gxEILwMfC7W1LEZwBeoB2rNnjz4PsXHjRho5ciQdPnyYgmXQoEH00UcfNVtJPOAP48F4AnUexHP5vIOR5x5aC0BaHiNn7vcxSEv4qWZsbKx+mhasY5Bdu3bpffCmTZsaXZ+RkdGhp7lks4sRxyABD4R98MEH6sorrwxaIN5zHl27dlWrV69WRUVF6v7779crbd26de2eFgLpQCC+On36tCopKVHBUlNTox588EH9jCoyMlINHjxYbdy40a9pIZDvhfF/jNuB2dOhQ4f8Pm4xEz8DS0tLC+g0HfNiHRgDgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYCzA6mpqaFHH32Uxo8fT0lJSXpMlYULF5q9WI5h+0B4IKHVq1fT+fPnaeLEiWYvjuPYfuTtfv366QEGectRXV0d9NGunM72gUjj0UHH2T6QjpKGRQUEQitWrNBj0oINDlJLSkr0LsOXy8GDBwMyz44Oi+p0ltrF9O/fn1555RWffrdv374Bmac0LCpYLJCePXtSbm6u2YsBVt3FgPVYagvir927d1Ntba0+q8rKy8tp69at+vvMzEzq3LmzyUtoY8oB+vXr1+pgw0eOHGn39DAs6vccsQU5evSo2YvgWDgGARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECAZEj3nJolBQiiibr+46IKgyaNgIRvE5EaWR9h4go3aBpYxcDIgQCIuxiBHfa6BjEKAhEUGHgircL7GJAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEBAhEDA2YEUFRXR9OnTacCAARQbG0u9evWirKws2rdvn9mL5gi2D2TlypX6w/wfeugh2rVrF7344ot6oMIRI0boeKCDlM2dOHGi2XU1NTWqe/fu6qc//alf08RwIN+z/RakpfHm4uLiKDU1lSorK01ZJidx5P8Xc+bMGdq/fz+NHTu2zd/FuLltUA40adIkFR4ert5///02fzcvL6/V0arIZhfeNQaapQIpLi72eWUcOHCgxWksWLBA37506VKfj2F4xTa87Nixw/QHmywSiKPGzeURtJ999llatGgRzZ0716fpYNzcNiiHWLhwof4r4q8dhWcx33NEIE8//bSOg3cvgYBALLqL8ccLL7xATz75JGVkZNCECROotLS00e18wgz8Z/tACgsL9dc33nhDX5rirSSEcCAlJSVmL4Kj2f5MKhgLgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYAIgYCzAzl48KD+EH8e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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-----------\n", - "Initializing structure...\n", - "time for choose_chunkdivision = 7.70092e-05 s\n", - "Working in 3D dimensions.\n", - "Computational cell is 0.8 x 0.8 x 8 with resolution 30\n", - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", - " axes (1,0,0), (0,1,0), (0,0,1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - " cylinder, center = (0,0,0.4)\n", - " radius 0.25, height 0.8, axis (0, 0, 1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - "time for set_epsilon = 0.866202 s\n", - "-----------\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "0e9613e70d61445790655ffde3e1e04f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0, description='0% done ', max=300.00023999999394)" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Meep progress: 13.816666666666666/300.00023999999394 = 4.6% done in 4.0s, 82.9s to go\n", - "on time step 830 (time=13.8333), 0.00481963 s/step\n", - "Meep progress: 26.316666666666666/300.00023999999394 = 8.8% done in 8.0s, 83.2s to go\n", - "on time step 1580 (time=26.3333), 0.00534261 s/step\n", - "Meep progress: 36.083333333333336/300.00023999999394 = 12.0% done in 12.0s, 87.8s to go\n", - "on time step 2167 (time=36.1167), 0.00681576 s/step\n", - "Meep progress: 50.15/300.00023999999394 = 16.7% done in 16.0s, 79.8s to go\n", - "on time step 3012 (time=50.2), 0.00473832 s/step\n", - "Meep progress: 64.6/300.00023999999394 = 21.5% done in 20.0s, 72.9s to go\n", - "on time step 3884 (time=64.7333), 0.00459009 s/step\n", - "Meep progress: 79.88333333333333/300.00023999999394 = 26.6% done in 24.0s, 66.2s to go\n", - "on time step 4801 (time=80.0167), 0.00436337 s/step\n", - "Meep progress: 97.83333333333333/300.00023999999394 = 32.6% done in 28.0s, 57.9s to go\n", - "on time step 5877 (time=97.95), 0.00371863 s/step\n", - "Meep progress: 114.98333333333333/300.00023999999394 = 38.3% done in 32.0s, 51.5s to go\n", - "on time step 6908 (time=115.133), 0.00388181 s/step\n", - "Meep progress: 133.16666666666666/300.00023999999394 = 44.4% done in 36.0s, 45.1s to go\n", - "on time step 7997 (time=133.283), 0.00367431 s/step\n", - "Meep progress: 149.41666666666666/300.00023999999394 = 49.8% done in 40.0s, 40.3s to go\n", - "on time step 8975 (time=149.583), 0.00409372 s/step\n", - "Meep progress: 166.21666666666667/300.00023999999394 = 55.4% done in 44.0s, 35.4s to go\n", - "on time step 9984 (time=166.4), 0.00396472 s/step\n", - "Meep progress: 182.43333333333334/300.00023999999394 = 60.8% done in 48.0s, 30.9s to go\n", - "on time step 10955 (time=182.583), 0.00412364 s/step\n", - "Meep progress: 199.05/300.00023999999394 = 66.3% done in 52.0s, 26.4s to go\n", - "on time step 11954 (time=199.233), 0.00400765 s/step\n", - "Meep progress: 216.23333333333332/300.00023999999394 = 72.1% done in 56.0s, 21.7s to go\n", - "on time step 12985 (time=216.417), 0.00388008 s/step\n", - "Meep progress: 234.18333333333334/300.00023999999394 = 78.1% done in 60.0s, 16.9s to go\n", - "on time step 14065 (time=234.417), 0.00370468 s/step\n", - "Meep progress: 252.71666666666667/300.00023999999394 = 84.2% done in 64.0s, 12.0s to go\n", - "on time step 15181 (time=253.017), 0.0035856 s/step\n", - "Meep progress: 271.3/300.00023999999394 = 90.4% done in 68.0s, 7.2s to go\n", - "on time step 16289 (time=271.483), 0.00361258 s/step\n", - "Meep progress: 289.3/300.00023999999394 = 96.4% done in 72.0s, 2.7s to go\n", - "on time step 17369 (time=289.483), 0.00370418 s/step\n", - "run 0 finished at t = 300.01666666666665 (18001 timesteps)\n", - "MPB solved for frequency_1(0,0,625000) = 625000 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,624999.999997)\n", - "MPB solved for frequency_1(0,0,629630) = 629630 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,629629.629626)\n", - "MPB solved for frequency_1(0,0,634259) = 634259 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,634259.259256)\n", - "MPB solved for frequency_1(0,0,638889) = 638889 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,638888.888886)\n", - "MPB solved for frequency_1(0,0,643519) = 643519 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,643518.518515)\n", - "MPB solved for frequency_1(0,0,648148) = 648148 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,648148.148145)\n", - "MPB solved for frequency_1(0,0,652778) = 652778 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,652777.777774)\n", - "MPB solved for frequency_1(0,0,657407) = 657407 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,657407.407404)\n", - "MPB solved for frequency_1(0,0,662037) = 662037 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,662037.037034)\n", - "MPB solved for frequency_1(0,0,666667) = 666667 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,666666.666663)\n", - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", - " axes (1,0,0), (0,1,0), (0,0,1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - " cylinder, center = (0,0,0.4)\n", - " radius 0.35, height 0.8, axis (0, 0, 1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIgAAAIJCAYAAAB+yXUGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAASdAAAEnQB3mYfeAAAGyZJREFUeJzt3QtwVPXZx/EnmyskpRhIA+Gm8UJIwkVbKJdOUSqYN6hBd6JvBigDRi4CSqdiq1ADVhDbOlPlKqYFGq4vF3lNAUUnhI5t4yiX1iW+gxIugYxIIEJIC9kk553nXzfm+mR3s2fPZX+fmW3Y3Zyzp2e/Oefs2XX/YZqmaQTQDkd7dwAgEOgQtiAgQiAgQiAgQiAgQiAgQiAgQiAgQiAgQiAQmoHk5+dTWFgYxcXFGb0olhZmxzfrLly4QGlpaRQbG0tXr16l69evG71IlmXLQB566CG19YiPj6ddu3YhkE6w3S5m8+bNdPjwYVqzZo3Ri2ILEWQjX331FS1YsIBWrFhBffv29XqaS5cuNbvt2rVrdPLkSRo8eDBFR0eT2d28eZPKy8tp7Nix1L1798DOXLMRp9OpjR49WmtoaFDXp02bpsXGxorT5OXl8S7WFpe9e/cGfJ3aZguye/duKiwspGPHjqnjD2899dRTlJ2d3ey20tJSeuyxx2j48OHqQDdYNNKotG8pXep2iRKuJVDq+VQKo47/v5TcUkI33r5B/fr1C/gy2SIQfpUyd+5cmj9/PiUlJdHXX3+tbq+trVU/+XpkZGSbT/b3vvc9dWnLihUraODAgRQM7gY3zT80ny6dvkQP3vYgrbxvJUU6Ir2adszKMXSWzuqzO9Rs4PTp0x1ufrOysryen8vlUtO4XC4tGGrrarXs/8nWaAmpn3zdF8mLknVbXltsQXr16kWHDh1qcwvAr2gOHDhAPXv2JDNy17tp8p7JtLN0J2WnZtOWR7dQZLh3W45gsEUgMTExdO+997a6fePGjRQeHt7mfd5wu92Nuym94pj2zjTa/X+7yZnipA0PbiCtXqPaev0eMyQD0UtkZCRFRUXpFsf0/52u4jDjlsO2J8pabkHMeJrdbfLdSsgEYkZuC8XBEEgQuS0WB0MgQeK2YBwMgQSB26JxMASiM7eF42AIREdui8fBEIhO3DaIgyEQHbhtEgdDIAHmtlEcDIEEkNtmcTAEEiBuG8bBEEgAuG0aB0MgneS2cRwMgXSC2+ZxMATiJ3cIxMEQiB/cIRIHQyA+codQHAyB+MAdYnEwBOIldwjGwRCIF9whGgdDIBaPw13vpos1F3WbPwKxeByT90ymmtoa3R4D/12M4Bcf/IIOVh80dRwcb2xULNWQPpFgCyI4eMr8cfDyJcYm6vZYCEQw4fYJpo+Dl09PCETw6v2vmj4OvZcPgQgiQzwOhkAswG3gqykEYnJug19qIxATc5vgPAwCMSm3CeJgCMSE3CaJgyEQk3GbKA6GQEzEbbI4GAIxCbcJ42AIxATcJo2DIRCDuU0cB0MgBnKbPA6GQAzitkAcDIEYwG2ROBgCCTK3heJgCCSI3BaLwzaBHD9+nCZOnEj9+/enLl26qMEMR40apcavMwu3BeOwzYeWecAgHm0pJyeH+vTpQzU1NbRlyxaaOnUqnTlzhhYvXmzo8rktGoei2dgPf/hDrV+/fj5PF8gBhWo7OViQ0QMK2WIX0x4eRCgiwriNpNvKWw477WI8Ghoa1KWqqop27txJ7733Hq1atcqQZXHbIA7bBcIjWL755pvq3zwQ0BtvvEGzZs3yedzcL774Qv18eNvDFJMU4/Ny8GDmF6ov0LWb16hbdDdyfeWiYW8OI72cu3pOt3nbKpAXXniBcnNz1ZPOQ6TOmzdPHbA+++yz7U7DI3QvXbo0oMsRFhZGfbt5N7BzIPT/bn8qozJd5h3GByJkU3PmzKH8/HyqqKighIQEn7YgkyZNIpfLRWlpaWR2J06coPT0dF2W11ZbkJZGjBhB69ato7KysnYDkcbNBZucKGsPD5XqcDgoOTnZ6EWxLFtsQWbOnEndunVTW4zExESqrKxUr2J27NhBCxcubHfrASESCJ9W37BhA23atEmdVY2Li6OhQ4dSQUEBTZkyxejFszRbBDJ9+nR1gcCz9TEIdB4CARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECAQQC/sMWBEQIBOwfSFFREc2YMYNSUlIoNjZWDY2alZVFR44cMXrRLM8Wgaxdu1aNj/vMM8/Q/v376fXXX1cjSY0cOVLFAyE+2sPq1atbjRqVkZFBd9xxBy1fvpzGjRtn2LJZnS22IG0NKcZjxqSmplJ5ebkhy2QXttiCtOXq1at09OjRDrce0rCoYONA5s6dq4ZEXbRokfh7egyLaie2DORXv/oVbdmyhVauXEnf//73OxyMOTs7u81hUcGGgfDW4OWXX6Zly5apgZU7gmFRQ+AgtWkcS5YsURcehRs6zzaB/PrXv1ZhLF68mPLy8oxeHNuwxS7mtddeoxdffFGd+5g4cSKVlJQ0u59PmEEIB1JYWKh+vvvuu+rSkqZpBiyVPdgikOLiYqMXwbZscwwC+kAgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgIEIgEBqBVFdX03PPPUcTJkyghIQECgsLU6M/QOfYJpDLly/T+vXr6ebNmxgtKoBs8WX+bMCAAVRVVaW2HJWVlZSfn2/0ItmCbQLhMCDwbBOIvzAsqizkA8GwqLKQDwTDospCPhAMixoiL3NBHwgEQmcXc+DAAaqpqVFnVVlpaSnt2rVL/TszM5O6du1q8BJaj60CmTNnDp09e7bx+s6dO9WFnT59mm699Va/5qtpmimHVuVzP3qf/7FVIGfOnNFlvg0NDVRfX09mEx4eri56slUggaZ9s+UIxhPhL723bjhINXDlW2EZsQUROBwOdeHjms8++4xqa2spOjq68YkJNs/xBr9jzcuRkpKi3qTkZdQLAvHCBx98QEuXLlXvEicmJqrbjDgm8ezmLl68qD7zkpeXRzNmzND1MRGIF7788ksqLy/X9UDYV+fOnVPLpTccg3ihq0nPnwRjubAF8WYlRUSoS11dHcXExBi6i+FjHz4GiYyMVMukNwTihfr6ehUH4wNVPlg0IhA+H+M5OHa73eq63rCLARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECARECgdAI5Pr167RgwQJKSkpSXzQ3bNgw2r59e0DmXW/C72kP1nL5HMhLL71En3zy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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-----------\n", - "Initializing structure...\n", - "time for choose_chunkdivision = 5.81741e-05 s\n", - "Working in 3D dimensions.\n", - "Computational cell is 0.8 x 0.8 x 8 with resolution 30\n", - " block, center = (0,0,-2)\n", - " size (1e+20,1e+20,4)\n", - " axes (1,0,0), (0,1,0), (0,0,1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - " cylinder, center = (0,0,0.4)\n", - " radius 0.35, height 0.8, axis (0, 0, 1)\n", - " dielectric constant epsilon diagonal = (11.7649,11.7649,11.7649)\n", - "time for set_epsilon = 0.812415 s\n", - "-----------\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "6f9c2a5250ac41019f89eabc96ff7e26", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0, description='0% done ', max=300.00023999999394)" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Meep progress: 14.233333333333333/300.00023999999394 = 4.7% done in 4.0s, 80.3s to go\n", - "on time step 855 (time=14.25), 0.00467964 s/step\n", - "Meep progress: 29.216666666666665/300.00023999999394 = 9.7% done in 8.0s, 74.2s to go\n", - "on time step 1755 (time=29.25), 0.00444807 s/step\n", - "Meep progress: 45.71666666666667/300.00023999999394 = 15.2% done in 12.0s, 66.8s to go\n", - "on time step 2744 (time=45.7333), 0.00404536 s/step\n", - "Meep progress: 61.53333333333333/300.00023999999394 = 20.5% done in 16.0s, 62.0s to go\n", - "on time step 3694 (time=61.5667), 0.0042123 s/step\n", - "Meep progress: 76.8/300.00023999999394 = 25.6% done in 20.0s, 58.2s to go\n", - "on time step 4611 (time=76.85), 0.00436382 s/step\n", - "Meep progress: 92.71666666666667/300.00023999999394 = 30.9% done in 24.0s, 53.7s to go\n", - "on time step 5566 (time=92.7667), 0.00419006 s/step\n", - "Meep progress: 112.78333333333333/300.00023999999394 = 37.6% done in 28.0s, 46.5s to go\n", - "on time step 6772 (time=112.867), 0.00331882 s/step\n", - "Meep progress: 133.68333333333334/300.00023999999394 = 44.6% done in 32.0s, 39.8s to go\n", - "on time step 8026 (time=133.767), 0.00319012 s/step\n", - "Meep progress: 154.73333333333332/300.00023999999394 = 51.6% done in 36.0s, 33.8s to go\n", - "on time step 9290 (time=154.833), 0.00316522 s/step\n", - "Meep progress: 177.31666666666666/300.00023999999394 = 59.1% done in 40.0s, 27.7s to go\n", - "on time step 10645 (time=177.417), 0.0029531 s/step\n", - "Meep progress: 200.18333333333334/300.00023999999394 = 66.7% done in 44.0s, 22.0s to go\n", - "on time step 12017 (time=200.283), 0.00291775 s/step\n", - "Meep progress: 222.31666666666666/300.00023999999394 = 74.1% done in 48.0s, 16.8s to go\n", - "on time step 13345 (time=222.417), 0.00301452 s/step\n", - "Meep progress: 244.13333333333333/300.00023999999394 = 81.4% done in 52.0s, 11.9s to go\n", - "on time step 14656 (time=244.267), 0.0030527 s/step\n", - "Meep progress: 264.15/300.00023999999394 = 88.0% done in 56.0s, 7.6s to go\n", - "on time step 15857 (time=264.283), 0.00333177 s/step\n", - "Meep progress: 284.25/300.00023999999394 = 94.7% done in 60.0s, 3.3s to go\n", - "on time step 17062 (time=284.367), 0.00332295 s/step\n", - "run 0 finished at t = 300.01666666666665 (18001 timesteps)\n", - "MPB solved for frequency_1(0,0,625000) = 625000 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,624999.999997)\n", - "MPB solved for frequency_1(0,0,629630) = 629630 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,629629.629626)\n", - "MPB solved for frequency_1(0,0,634259) = 634259 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,634259.259256)\n", - "MPB solved for frequency_1(0,0,638889) = 638889 after 23 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,638888.888886)\n", - "MPB solved for frequency_1(0,0,643519) = 643519 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,643518.518515)\n", - "MPB solved for frequency_1(0,0,648148) = 648148 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,648148.148145)\n", - "MPB solved for frequency_1(0,0,652778) = 652778 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,652777.777774)\n", - "MPB solved for frequency_1(0,0,657407) = 657407 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,657407.407404)\n", - "MPB solved for frequency_1(0,0,662037) = 662037 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,662037.037034)\n", - "MPB solved for frequency_1(0,0,666667) = 666667 after 22 iters\n", - "Dominant planewave for band 1: (0.000000,-1.250000,666666.666663)\n" - ] - }, - { - "data": { - "image/png": "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0bhrQM9eBOmPPfaYJtSPHDkycGdLRERERH5Dt1DTlnS+x6YefvhhCTa/BjMaPXq0zJ8/X3vTomOBYydSBOuuVV+IiIiIiNKio0ePauzrbjTUsAxm9PLLL8vAgQOT5N1ggCNjNFIiIiIisg5vo4qmZMTRSPLSSy/J5cuX5a233tLvUcsd5SCvX7+uVV82btzod1Ucv1rSjx07JnXq1HG7LGPGjHLx4kV/dk9EREREwazuYjaRRxhV1XE8IATtVapU0UGOihUrJq+88oqEtSUdJRgPHjzothY6Roi69dZb/dk9EREREQUDSzCKvw3VGFEVkN6ybds2HWCpWbNmcu3aNXnmmWf8O4C/LektWrTQvHScqAGdR8+fP6/laNDsT0RERETWLMFoNpFn6IeZmPhvTtCmTZskJiZG6tevr9+jPDkqHoY1SEfllvj4eG3ub9++vQboL774oo5khbsI5KsTERERkbVoIJ5oMjFIN1WyZEn54osv9N8LFy6UO+64w152/K+//tIy5GEN0vPnz6/N+xh16ccff9S7iF9++UUru2zevNnt6EtEREREFGbMSfcLSo1jIKPcuXPLRx99pKOPGtCy7pivHpacdCNQf++99/w+ESIiIiIKEeak+6Vv377aWo5GabSid+3a1b7s6tWr0qNHj/AH6URERESUyngpwcgRR73r1KmTTq6mTZsmgeB3kL59+3Yd0OjIkSOah+4IOerLli3z9xBEREREFGjMO7c0v4L0OXPmSM+ePSU6OlrLMaZPnz5JkE5ERERE1uKtggs7jpq7efOmjBkzxrShGsVVwhako/xiy5YtZfbs2QHpxUpEREREIcCcdL+88MILOtooiqW0adNGMmTIIIHmV5CO+uiTJ09mgE5ERESUihilFs2Wk2cff/yxDB06VIYNGybB4leQXr16daeBjIiIiIgoFWBLul/++ecf++BFweJXnfRx48bJ66+/Lr/++mvgzoiIiIiIgioqGRN5hgD9559/lmDyqyW9du3a0q5dO21RxxCoroMXIWkegxsRERERkfVGHDVbTp69/fbbcv/990tcXJy0atUqSfGUsAfp6NX62muvSd68efUkg3GCRERERBRgTHfxS7Vq1bTCS4cOHbRROnPmzE7LMe/8+fPhC9IxHGqvXr1k6tSpEhMT49eJEBEREVGIMEj3S/v27YNeatyvIP3ChQvSpUsXBuhEREREqQiru/hn1qxZEmx+dRy966675Lfffgvc2RARERFRSAc0cjdR+Pmd7oLm/iJFimgxd+akExEREaUCTHcJiJ07d8ru3bvl6tWrSZZ17949fEH67bffrknzqPASrKR5IiIiIgosby3mbE03d+XKFbnvvvvkm2++0XjXZvv3zXTMUw9rkB6KpHkiIiIiCjCUXzQbVZQjjpoaNWqUHD58WNavXy8NGjSQxYsXS7Zs2eS9996THTt2yEcffST+irV60jwRERERBRZb0v2zbNkyef7556Vu3br6fdGiRaVGjRrSpEkTLary7rvvasAeto6jRERERJTK89LdTWQKrejlypXTCofIKkH6i+Ghhx6SpUuXSlhb0kORNE9EREREgRWVaNPJbDl5liNHDrl8+bL+O1++fLJv3z6tegjor2ksC1uQHoqkeSIiIiIKLKa7+Kdy5cry+++/y7333iuNGjWSV199VUqXLq2VDkeOHClVq1b18wh+prs4Js0jQEfS/KpVq7TaC070p59+8vsEiYiIiCiEqS5MefGqd+/ecvHiRf336NGjteEaHUjr1KkjR44ckTfeeEPC2pIeiqR5IiIiIgostqT758EHH7T/u3jx4tqqbmSWIC7OlStXeFvSQ5E0T0REREQBhjrpiZ4ndh71DH0w0Rj97bff2udlyZJFWrduLa1atQpIgO53kO4uad4QqKR5IiIiIgowprukWKZMmTSbJDExuMXkowORNA9G0jzuKr7//vuAJc0TERERUXDSXcwm8qxatWpa3TCYYv1Nmjdaz5E0j9IzSJo3WtmXL18emLMkIiIiooCJsnkpwfhfxT5y7/XXX5du3bpJxYoV7bGvpVrSkTQ/ZMgQp6R55KHjEQCC91q1agXqPImIiIgojaa7XLp0SQYMGCCFChWSjBkzakv1woULk739yZMnpUePHpInTx7JnDmzVllZs2ZNkvUaNmyo/ShdJ5RS9GbDhg16ntCvXz/9d+PGjfWYyC6pUqWKfQpENklABjNyTZonIiIiIuuydxA1WR5KKN+9bds2baEuU6aMzJ8/Xzp37qx53+ikaeb69etaWfDcuXMyceJE7Sc5efJkDbxXr16dpKW7RIkSMm/ePKd5yADxBqnd3333ndxxxx2SO3duDc6DKaBBOhERERGlAt5ay0PYko70aIyzYwTmRkB8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GzBggK179+62DBky2KKjo23ffPON0z6+++47W7p06WxNmjSx9enTx/b888/bOnfubMuSJYstNjbWtmLFCqf18T32kyNHDt3vCy+8YHvsscds9evXt+XLl89p3X/++cdWvXp1PacaNWrYnnjiCVu/fv1sJUuW1HlDhgxJ1nuA88L6n332WZJl165ds+XMmdOWP39+282bN30+R0+WL1+ux2zdurXT/JdeeknnHzt2zPbMM8/YYmJibOfPn7cv37lzpy6vUqWKfR6OjeN26NDBNnDgQNtTTz1lq1evnq5Xvnx524ULF+zr/vnnn3rueL/cGTNmjG73zjvv2OfduHHD1qxZM51ftmxZPR6OgXPAvK5duzrtw/icPPzww35dr7Vr1+r8li1b2jJlymRr3Lixvid4nXgNGTNmtO3Zs8dpm7///ttWrFgx3Q7XY/DgwbYePXrYMmfObGvTpo3OHzZsmP188O+4uDj7fGOaOXOmfZ9YXqhQIdudd95pK168uH5ecN6Yh+2GDx9uSy5frhXgPLCsffv2+vOCz8uzzz5ra9Gihc7Hz+GpU6ectvn9999tuXPn1uXNmzfXzyeOZ2yP+Y6vz4xxfNdr6QqfAayHc/P2OXjttddst9xyi16P/v376zW99957bVFRUbYCBQroZ9Td5wCvGdccn0Vsc8899+j80qVL23bv3q2vGdcI7yveL+wP78/FixdT/DlcsmSJnj/mN2jQwOkzgtdn6NWrl65z66236r9xDnXr1rX/vjR+dxgwv3LlyvrZqlixop7Dk08+qb8XiMgaGKSTZYP0VatW6R85TIcPH3b6o+suMFm5cqU9KHB07ty5JEEEHD161FawYEG9EXDUrl073c/PP/+cZBvX/Rh/PBFYOrp69ar+Ice5b9++3et7sHnzZnsg5Orjjz/WZfijm5Jz9OTSpUt684JgJT4+3j4ff9gRCMMXX3yhx/n888/ty99++22d9/TTT9vn4fo47sPw/vvv67qvv/6603wjuNmxY0eSbSpUqKDndfr0afs8BCRYH4GE43HwbyM4Wbp0qdfgzNfrZQRn7oLK9957T+f37dvXab5xPs8995zTfFyr9OnTOwXpBgRfZm0mRhCPz/aVK1ecbghw/TDhRiY5fL1WRpCMm7XVq1c7LcMNiLv3s2nTpjp/woQJTvNxjTy9n/4G6cb548bI2+cA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nCHKN2IgpHz58mlZw7179zpVTUE98tGjR2tQj46aGKMHHUenTZumnTVRcTBU1q9fr6OKosRkMPgVpKN5/80335RHH300cGdEREREREFl89KSjuUpsXjxYhkyZIgMHTpU88lRgQWBOkokGpBlgclxwCS0Qq9Zs0YHLurfv7+OxYPqKAjAHUcbLViwoAb7o0aNktOnT2vWRunSpWXkyJHyzDPPhDTdBccuUqRI0PbvV5COAYzQm5aIiIiIIrslHTCYEVKgXdOgHc2aNUsnV/nz57enrXiC1nnUILcCtPp/8cUXcvfdd1svSO/evbssXLhQH20QERERUeTmpEeaBx98ULNJEhMTNc0GFWoCWUDFryC9atWq+kgDeUEtW7Z0W90FZRqJiIiIKPUNZkSeIQceJk2apPn0lqru8tBDD+nXw4cPa/F4V6zuQkRERGQ9CYnIDTdfTuZmzpwpweR3x1EiIiIiSl2C1XE0kjz88MPWDdIde9sSERERUerAlnTr8ytIJyIiIqLUhx1HAwNlJufPny+7d+/WQT5d075nzJgRniDdSJj3BCeHmpdEREREZK0g3SwnndVdvPvjjz+kZs2aWtMdU548eTRoR2fRnDlzyi233CL+8KviO0rOoPeq43Tq1Cn59ttv5ffff3cqUk9ERERE1pBo8z6RucGDB0vFihXl77//1pgXAy9dvnxZ3nnnHcmYMaPf9dz9aklft26d2/kI0O+//34ZNmyYP7snIiIioiBA+UXTlnSWYPTqu+++k7Fjx2pADgjU06dPL//73/80cB80aJAOdpRSQRk7tUyZMnpiGNqViIiIiKyFLen+QyBesGBBiY6OlpiYGLlw4YJTcRVklvgjKEE6FCtWTHbu3Bms3RMRERGRH9Vd4hM8T6yT7l3+/Pk1B92Ie3/44Qf7MowhFBsba83qLosWLZJChQoFa/dERERE5E8JRpNa6AzSvatdu7Zs375d7rvvPmnXrp2MHDlSrl+/rikv48aN81pgJahBeq9evZLMw8n9+uuv8ttvv2meDhERERFZL90lwaRzKDuOevfss89qizkMHTpUyzCiPyZy0+vXry8TJ06UsAXp33zzjZZZdITkeTT5v/DCC9KlSxe/To6IiIiIAg8BumlLOqu7eHXbbbfpBFmyZJHPPvtM89IRG2fLlk385VeQbtw9EBEREVHqwZb04Mie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JyIiIoowTHexPgbpRERERBEmGi3pJq3lWE7hxSCdiIiIKMLERkWZdg7FcgovBulEREREEYaDGVkfg3QiIiKiCBMTFa2T2XIKLwbpRERERBGGI45aH4N0IiIioggT7aVzKNvRw49BOhEREVGEYXUX62OQTkRERBSBQbppSzqru4Qdn2YQERERRWhLuqcp1EH6pUuXZMCAAVKoUCHJmDGjVKtWTRYuXJisbf/880/dtkGDBpIjRw6JioqSWbNmeVx/9erVUqdOHcmcObPkyZNHevToISdPnhSrYZBOREREFGGikvFfKLVr105mz54tw4YNkxUrVkjNmjWlc+fOMn/+fK/b7t+/X+bNmyfp06eXFi1amK67fv16ad68ueTPn1+WLVsmEydO1KC9SZMmcv36dbESprsQERERRZhoidLJbHmoLF++XFatWqUBOQJzaNSokRw5ckQGDRokHTt2lJiYGI/b169fX06dOqX//uGHH2TBggUe18X+ypQpI59++qnExv4bBhcvXlzuvPNO+eCDD6Rv375iFWxJJyIiIorE6i7/Berup9BZsmSJZM2aVTp06OA0v2fPnnL8+HHZunWr6fbRJiOnOjp27Jhs27ZNunXrZg/QoW7duhq44zyshC3pJozHHtcTroXqehAREVEaZMQSVkmpQCt1cpYjlcRV3rx5JV++fAE7l507d0r58uWdAmeoUqWKfTkCaX9hP477dYR5mzZtEithkG5ix44d+vXwxaQfUCIiIqKUxBY1atQI2xuXM2dOyZYtmzzyv0e8rosc7zZt2iSZj7zx4cOHB+yczpw5IyVKlEgyP1euXPblgTqO435djxWo4wQKg3QTePQBH3/8sVSoUCFU14RSAHf6+EWydOlSKVWqFN9Di+J1Sj14rVIPXqvU4bfffpMHH3zQHluEC6qn7NmzR/755x+v6yYkJLjNBUdLuifr1q3TfPLk2L59u1ZxAVRk8SQqwJVmPO0v0MfxF4N0E9mzZ9evCNArVqwYqmtCfkCAzmtlfbxOqQevVerBa5W6YotwB+qYgqFs2bIyffr0ZK1btGhR/Zo7d263rdhnz5712PKdEjgOeDpWoI4TKAzSiYiIiCggChYsKI884j2VxlHlypW1Ikt8fLxTXvqO/9KOK1WqFJBzM/aD/bqWasS8QB0nUFjdhYiIiIjCpm3btjqY0aJFi5zm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27Zt+joyZ84sJUqUkNdffz3JOe7atUvuueceXQfpJv/73//kyy+/1CcQxs0N9od5R44c0fnG5OrNN9+U4sWLS9asWaVOnTqyZcsWSY53331XWrduLTly5EiSRjNr1qwk62P+8OHD7d/j35j366+/SocOHeSWW27R6zVw4ECJj4/X63/vvfdqKz1SiMaOHZtkn7fddpuUL19e3nvvvWSdMxERJcUgnYiSzWgRd2xNR2t5gwYN5M4779TgbuPGjU7LEFQj0DOCxccee0w+/vhjWbx4sbRr10769+8vo0aNsm/Tq1cv+eOPP+Sbb75xOvaePXvk+++/l549e9rnYV8DBgyQu+++W5YuXapBNwLlunXryt9//236WnzZ9sSJE5rC0bVrV/nss8+kefPm8sILL8jcuXPt6+DGBe8DglgEysgLxw0LWpUd4Th4rwoUKCDfffedfXI0efJkWbVqlabEzJs3Ty5fvqw3QefPnzd9TUgvQupRIJ5cPPjgg9rXYNGiRfLoo4/KW2+9pSksuIlq2bKlLFmyRBo3bqxpNbiWrnAzsmLFCqcbMCIi8oGNiCiZzp49a4uOjrb16dNHvz99+rQtKirKtnLlSv3+jjvusD377LP67z/++APRme25555zu6+EhATbzZs3bSNHjrTlzp3blpiYqPMxL3/+/LYuXbo4rY/9pE+fXo8J3333ne7/jTfecFrv6NGjtkyZMjkd9+GHH7bFxcXZv/dl2wYNGui6W7dudVq3QoUKtmbNmtm/HzRokL4Xu3btcloP62D7tWvX2ue1bNnS6XwMhw4d0nUrV65si4+Pt8///vvvdf6CBQtsZj766CNdb8uWLW73O3PmzCTbYP6wYcPs3+Pf7t6batWq6fzFixfb5+Fa5c2b19auXbsk+50+fbquv3v3btNzJiIi99iSTkTJhpQQtK4aLenIR0c6C1qGAS3JRh66u3x0tI6j5Rot69guXbp0MnToUM2hPnnypK6D/Ha0WKN11mg5TkhIkA8//FDuv/9+yZ07t8774osvtOUe6yINw5jQQu14ju74ui3m33HHHU7zqlSpoikrBrwXSIupUKGC03qdO3f2+ROGlmq8P47HAsfjuXP8+HH9mi9fPvFXq1atnL5H+greMzxFMOBalSpVyu15Gedw7Ngxv8+FiCgSMUgnIp8g6EaZPQSECMSRf4y8aSNI3759uwbXWIYg7q677tJlSFVBvjZMnz5dNm3apHneQ4YM0XlXr151Snm5du2aLFy4UL9HaUekkzimuiAlBQ3B+fPn12DfcUL+9unTpz2+Bl+3NW4MHGXIkMHpnHGjgf25cjfPG9fj4VjgeDx3jOUZM2YUfyEP3RHKKiLX3nXfmI9r5cpYz9s5ExGRe7Ee5hMReQzS0akRrc2YkCttMAJyVPYwOpQaATwCbgTBaMV2DPSQD+4KrdFouZ45c6bmjuNroUKF7EG+UW3GyIE3glhH7uYFYluzwNpdHjzy2UMFr8soi1mwYEH7fOP9vn79utP6uLEIFpyD4zkREZFv2JJORD6pX7++pmJgcCN0tEQHQQPSWFAtBWUA0UnUMdUFQTFa1h3TONDKijQWd9BqvnXrVvn222/l888/l4cffthpW6RjoDUc6RS33357kqly5coeX4M/23qCpwg7d+6U3377zWm+8TTArBU+UMqVK6dfDxw4kKQ1H4E6KrY4WrZsmQQLquRER0dL2bJlg3YMIqK0jC3pROQTo3QiWsARhBn56I7BqjFQj2OQjjxrtMB36dJF+vTpo624GFnTU6s1crlR9g9f0QKMUUMd4bjYD4L5H374QW8eMKAS0mIQ2CPQ7tu3r9t9+7OtJ6gU88EHH2jO9siRIzUwxqBFqEoDeK8M2D9y7lEFBulCWIabA3+hRCXKSSJl57777rPPN/LvcX4YARZ590g/wvkFC84BN2zox0BERL5jSzoR+QzBN1qiq1evrkG7a5COZchVRjlDA8r1IUhEiUDU8UYuOuqSDx482O0x0Crftm1bLSuIoBojWbqaOnWqTJo0SdNrOnXqpDcC6IiKkoWuHT0Dua07SMdB51Gc5+OPP64lG/EeIGAHx7rlTz31lL52jAxau3ZtTQsKBBwP+3XXQv7GG29ooI665uiAi7KPSD0KhkuXLsmaNWv0PSAiopSJQomXFG5LREReoMV+wYIF+uQAQXSw4ckAgn60ZKNlPRwwQBVuRI4ePcqWdCKiFGKQTkQUIGg1R4s6RiRFazJaqt9//3156aWX7C3qodCxY0d9IhCslnIzKGWJjr/oQ2BU7iEiIt8xJ52IKEBQvWbcuHGaooNgtXTp0pqHj1blUEJqC1qzMeJptmzZQnpstJ4jreaZZ54J6XGJiNIatqQTEREREVkMO44SEREREVkMg3QiIiIiIothkE5EREREZDEM0omIiIiILIZBOhERERGRxTBIJyIiIiKyGAbpREREREQWwyCdiIiIiMhiGKQTEREREVkMg3QiIiIiIrGW/wP0zCDrDi7fWgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "sim.reset_meep()\n", "\n", @@ -772,18 +335,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "352d606d", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0\n" - ] - } - ], + "outputs": [], "source": [ "print(input_flux[0])" ] @@ -805,7 +360,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.12" + "version": "3.13.14" } }, "nbformat": 4,