def modes_n_gain(inc_a_x): inc_a_y = inc_a_x # Use all specified parameters to create a waveguide object. wguide = objects.Struct( unitcell_x, inc_a_x, unitcell_y, inc_a_y, inc_shape, material_bkg=materials.get_material("Vacuum"), material_a=materials.get_material("SiO2_2016_Smith"), lc_bkg=1, lc_refine_1=400.0, lc_refine_2=50.0) sim_EM_pump = wguide.calc_EM_modes(num_modes_EM_pump, wl_nm, n_eff=n_eff) sim_EM_Stokes = mode_calcs.bkwd_Stokes_modes(sim_EM_pump) k_AC = np.real(sim_EM_pump.Eig_values[EM_ival_pump] - sim_EM_Stokes.Eig_values[EM_ival_Stokes]) shift_Hz = 4e9 sim_AC = wguide.calc_AC_modes(num_modes_AC, k_AC, EM_sim=sim_EM_pump, shift_Hz=shift_Hz) set_q_factor = 600. SBS_gain, SBS_gain_PE, SBS_gain_MB, linewidth_Hz, Q_factors, alpha = integration.gain_and_qs( sim_EM_pump, sim_EM_Stokes, sim_AC, k_AC, EM_ival_pump=EM_ival_pump, EM_ival_Stokes=EM_ival_Stokes, AC_ival=AC_ival) #, fixed_Q=set_q_factor) interp_values = plotting.gain_spectra(sim_AC, SBS_gain, SBS_gain_PE, SBS_gain_MB, linewidth_Hz, k_AC, EM_ival_pump, EM_ival_Stokes, AC_ival, freq_min, freq_max, num_interp_pts=num_interp_pts, save_fig=False, suffix_str='%i' % int(inc_a_x)) # Clear memory wguide = sim_EM_pump = sim_EM_Stokes = sim_AC = None SBS_gain = SBS_gain_PE = SBS_gain_MB = linewidth_Hz = Q_factors = alpha = None return interp_values
num_AC_modes = 20 # The EM pump mode(s) for which to calculate interaction with AC modes. # Can specify a mode number (zero has lowest propagation constant) or 'All'. EM_ival_pump = 0 # The EM Stokes mode(s) for which to calculate interaction with AC modes. EM_ival_Stokes = 0 # The AC mode(s) for which to calculate interaction with EM modes. AC_ival = 'All' # Use all specified parameters to create a waveguide object. wguide = objects.Struct(unitcell_x, inc_a_x, unitcell_y, inc_a_y, inc_shape, material_bkg=materials.get_material("Vacuum"), material_a=materials.get_material("Si_2016_Smith"), lc_bkg=1, lc_refine_1=1000.0, lc_refine_2=400.0) # Expected effective index of fundamental guided mode. n_eff = wguide.material_a.n - 0.1 # Calculate Electromagnetic Modes sim_EM_pump = wguide.calc_EM_modes(num_modes_EM_pump, wl_nm, n_eff=n_eff) sim_EM_Stokes = mode_calcs.bkwd_Stokes_modes(sim_EM_pump) k_AC = np.real(sim_EM_pump.Eig_values[0] - sim_EM_Stokes.Eig_values[0])
# The EM Stokes mode(s) for which to calculate interaction with AC modes. Typically 0 for FSBS. EM_ival_Stokes = EM_ival_pump # The AC mode(s) for which to calculate interaction with EM modes. AC_ival = 'All' # Output files are generated in a folder with the following prefix prefix_str = 'fsbs-josab-04-450x200nmSi' # Use all specified parameters to create a waveguide object wguide = objects.Struct( unitcell_x, inc_a_x, unitcell_y, inc_a_y, inc_shape, material_bkg=materials.get_material("Vacuum"), material_a=materials.get_material("Si_2021_Poulton"), lc_bkg= 0.05, # mesh coarseness in background, larger lc_bkg = coarser along horizontal outer edge lc_refine_1= 20.0, # mesh refinement factor near the interface of waveguide, larger = finer along horizontal interface lc_refine_2= 30.0, # mesh refinement factor near the origin/centre of waveguide plt_mesh= False, # creates png file of geometry and mesh in backend/fortran/msh/ check_mesh=False) # note requires x-windows configuration to work # Explicitly remind ourselves what data we're using. print('\nUsing %s material data from' % wguide.material_a.chemical) print('Author:', wguide.material_a.author) print('Year:', wguide.material_a.date)
# Number of electromagnetic modes to solve for. num_modes_EM_pump = 20 num_modes_EM_Stokes = num_modes_EM_pump # Number of acoustic modes to solve for. num_modes_AC = 35 # The EM pump mode(s) for which to calculate interaction with AC modes. # Can specify a mode number (zero has lowest propagation constant) or 'All'. EM_ival_pump = 0 # The EM Stokes mode(s) for which to calculate interaction with AC modes. EM_ival_Stokes = 1 # INTERMODE SBS TE0 to TE1 # The AC mode(s) for which to calculate interaction with EM modes. AC_ival = 'All' # Si_110 = copy.deepcopy(materials.get_material("Si_2015_Van_Laer") Si_110 = copy.deepcopy(materials.get_material("Si_2016_Smith") Si_110.rotate_axis(np.pi/4,'z-axis', save_rotated_tensors=True) prefix_str = 'fig16-' # Use specified parameters to create a waveguide object. wguide = objects.Struct(unitcell_x,inc_a_x,unitcell_y,inc_a_y,inc_shape, slab_a_x=slab_a_x, slab_a_y=slab_a_y, slab_b_y=slab_b_y, coat_x=coat_x, coat_y=coat_y, coat2_x=coat2_x, coat2_y=coat2_y, material_bkg=materials.get_material("Vacuum"), material_a=Si_110, #plt_mesh=True, material_b=Si_110, material_c=materials.get_material(["Vacuum"), material_d=materials.get_material(["Vacuum"), material_e=materials.get_material("Vacuum"), symmetry_flag=False, lc_bkg=lc_bkg, lc_refine_1=lc_refine_1, lc_refine_2=lc_refine_2, lc_refine_3=lc_refine_3, lc_refine_4=lc_refine_4, lc_refine_5=lc_refine_5)
# Number of acoustic modes to solve for. num_modes_AC = 100 # The EM pump mode(s) for which to calculate interaction with AC modes. # Can specify a mode number (zero has lowest propagation constant) or 'All'. EM_ival_pump = 0 # The EM Stokes mode(s) for which to calculate interaction with AC modes. EM_ival_Stokes = 0 # The AC mode(s) for which to calculate interaction with EM modes. AC_ival = 'All' prefix_str = 'lit_10b-' #reuse_fields=True # use saved data reuse_fields=False # calculate from scratch Ge_110 = copy.deepcopy(materials.get_material("Ge_cubic_2014_Wolff")) print('Initial Ge_100:', Ge_110.full_str()) Ge_110.rotate_axis(np.pi/4., 'y-axis', save_rotated_tensors=True) print('Rotated Ge_110:', Ge_110.full_str()) # Use specified parameters to create a waveguide object. # Note use of rough mesh for demonstration purposes. wguide = objects.Struct(unitcell_x,inc_a_x,unitcell_y,inc_a_y,inc_shape, material_bkg=materials.get_material("Si3N4_2014_Wolff"), material_a=Ge_110, lc_bkg=1, lc_refine_1=50.0, lc_refine_2=50.0) # Expected effective index of fundamental guided mode. n_eff = wguide.material_a.n-0.1
num_modes_EM_pump = 20 num_modes_EM_Stokes = num_modes_EM_pump num_modes_AC = 800 EM_ival_pump = 0 EM_ival_Stokes = 0 AC_ival = 'All' prefix_str = 'lit_02-' # Use all specified parameters to create a waveguide object. wguide = objects.Struct(unitcell_x, inc_a_x, unitcell_y, inc_a_y, inc_shape, material_bkg=materials.get_material("Vacuum"), material_a=materials.get_material("Si_2013_Laude"), lc_bkg=1, lc_refine_1=400.0, lc_refine_2=50.0) # Expected effective index of fundamental guided mode. n_eff = 3.4 # Calculate Electromagnetic modes. sim_EM_pump = wguide.calc_EM_modes(num_modes_EM_pump, wl_nm, n_eff=n_eff) sim_EM_Stokes = mode_calcs.bkwd_Stokes_modes(sim_EM_pump) plotting.plot_mode_fields(sim_EM_pump, xlim_min=0.2, xlim_max=0.2,
prefix_str = 'lit_09-' # Use specified parameters to create a waveguide object. # Note use of rough mesh for demonstration purposes. wguide = objects.Struct( unitcell_x, inc_a_x, unitcell_y, inc_a_y, inc_shape, slab_a_x=slab_a_x, slab_a_y=slab_a_y, coat_x=coat_x, coat_y=coat_y, material_bkg=materials.get_material("Vacuum"), material_a=materials.get_material("As2S3_2017_Morrison"), # waveguide material_b=materials.get_material("SiO2_2016_Smith"), # slab material_c=materials.get_material("SiO2_2016_Smith"), # coating lc_bkg=1, lc_refine_1=800.0, lc_refine_2=400.0) # Expected effective index of fundamental guided mode. n_eff = wguide.material_a.n - 0.1 # Calculate the Electromagnetic modes of the pump field. sim_EM_pump = wguide.calc_EM_modes(num_modes_EM_pump, wl_nm, n_eff) # # np.savez('wguide_data', sim_EM_pump=sim_EM_pump) # npzfile = np.load('wguide_data.npz') # sim_EM_pump = npzfile['sim_EM_pump'].tolist()
print('\n\nCommencing NumBAT tutorial 9 - fast mode') prefix_str = 'ftut_09-' refine_fac = 1 else: print('\n\nCommencing NumBAT tutorial 9') prefix_str = 'tut_09-' refine_fac = 5 # Use of a more refined mesh to produce field plots. wguide = objects.Struct( unitcell_x, inc_a_x, unitcell_y, inc_a_y, inc_shape, material_bkg=materials.get_material("Vacuum"), material_a=materials.get_material("Si_test_anisotropic"), lc_bkg=1, lc_refine_1=200.0 * refine_fac, lc_refine_2=1.0 * refine_fac) # Expected effective index of fundamental guided mode. n_eff = wguide.material_a.n - 0.1 # Calculate the Electromagnetic modes of the pump field. sim_EM_pump = wguide.calc_EM_modes(num_modes_EM_pump, wl_nm, n_eff) # Display the wavevectors of EM modes. v_kz = sim_EM_pump.kz_EM_all() print('\n k_z of EM modes [1/m]:') for (i, kz) in enumerate(v_kz):
if len(sys.argv) > 1 and sys.argv[ 1] == 'fast=1': # choose between faster or more accurate calculation prefix_str = 'ftut_12-' refine_fac = 1 else: prefix_str = 'tut_12-' refine_fac = 4 # Use of a more refined mesh to produce field plots. wguide = objects.Struct(unitcell_x, inc_a_x, inc_shape=inc_shape, inc_b_x=inc_b_x, unitcell_y=unitcell_y, material_bkg=materials.get_material("Vacuum"), material_a=materials.get_material("SiO2GeO2_smf28"), material_b=materials.get_material("SiO2_smf28"), lc_bkg=.5, lc_refine_1=1.0 * refine_fac, lc_refine_2=20 * refine_fac, plt_mesh=True) # Expected effective index of fundamental guided mode. n_eff = wguide.material_a.n - 0.001 new_calcs = True micron = 1e-6 lam_hi = 1.65 lam_lo = 1.45
# The EM Stokes mode(s) for which to calculate interaction with AC modes. EM_ival_Stokes = 0 # The AC mode(s) for which to calculate interaction with EM modes. AC_ival = 'All' prefix_str = 'lit_10-' #reuse_fields=True # use saved data reuse_fields=False # calculate from scratch # Use specified parameters to create a waveguide object. # Note use of rough mesh for demonstration purposes. wguide = objects.Struct(unitcell_x,inc_a_x,unitcell_y,inc_a_y,inc_shape, #slab_a_x=slab_a_x, slab_a_y=slab_a_y, #coat_x=coat_x, coat_y=coat_y, material_bkg=materials.get_material("Si3N4_2014_Wolff"), material_a=materials.get_material("Ge_cubic_2014_Wolff"), # waveguide lc_bkg=1, lc_refine_1=50.0, lc_refine_2=50.0) # Expected effective index of fundamental guided mode. n_eff = wguide.material_a.n-0.1 # Calculate the Electromagnetic modes of the pump field. if not reuse_fields: sim_EM_pump = wguide.calc_EM_modes(num_modes_EM_pump, wl_nm, n_eff) np.savez('wguide_data', sim_EM_pump=sim_EM_pump) else: npzfile = np.load('wguide_data.npz', allow_pickle=True) sim_EM_pump = npzfile['sim_EM_pump'].tolist() sim_EM_pump.analyse_symmetries(PointGroup.C2V)
print('\n\nCommencing NumBAT tutorial 7 - fast mode') else: prefix_str = 'tut_07-' refine_fac = 4 print('\n\nCommencing NumBAT tutorial 7') wguide = objects.Struct( unitcell_x, inc_a_x, unitcell_y, inc_a_y, inc_shape, slab_a_x=slab_a_x, slab_a_y=slab_a_y, inc_b_x=inc_b_x, material_bkg=materials.get_material("Vacuum"), # background material_a=materials.get_material("As2S3_2017_Morrison"), # slot material_b=materials.get_material("SiO2_2013_Laude"), # slab material_c=materials.get_material("Si_2016_Smith"), # walls of slot lc_bkg=1, lc_refine_1=200.0 * refine_fac, lc_refine_2=100.0 * refine_fac, plt_mesh=True) # Expected effective index of fundamental guided mode. n_eff = wguide.material_a.n - 0.1 # Calculate Electromagnetic modes. sim_EM_pump = wguide.calc_EM_modes(num_modes_EM_pump, wl_nm, n_eff=n_eff) # np.savez('wguide_data', sim_EM_pump=sim_EM_pump) # npzfile = np.load('wguide_data.npz', allow_pickle=True)
def ac_mode_freqs(coat_y): print('Commencing mode calculation for coat_y = %f' % coat_y) wguide = objects.Struct( unitcell_x, inc_a_x, unitcell_y, inc_a_y, inc_shape, slab_a_x=slab_a_x, slab_a_y=slab_a_y, inc_b_x=inc_b_x, coat_y=coat_y, material_bkg=materials.get_material("Vacuum"), # background material_a=materials.get_material("As2S3_2017_Morrison"), # slot material_b=materials.get_material("SiO2_2013_Laude"), # slab material_c=materials.get_material("Si_2016_Smith"), # walls of slot material_d=materials.get_material("SiO2_2013_Laude"), # coating lc_bkg=1, lc_refine_1=100.0 * refine_fac, lc_refine_2=50.0 * refine_fac) # Expected effective index of fundamental guided mode. n_eff = wguide.material_a.n - 0.1 # Calculate Electromagnetic modes. sim_EM_pump = wguide.calc_EM_modes(num_modes_EM_pump, wl_nm, n_eff=n_eff) sim_EM_Stokes = mode_calcs.bkwd_Stokes_modes(sim_EM_pump) k_AC = np.real( sim_EM_pump.kz_EM(EM_ival_pump) - sim_EM_Stokes.kz_EM(EM_ival_Stokes)) shift_Hz = 4e9 # Calculate Acoustic modes. sim_AC = wguide.calc_AC_modes(num_modes_AC, k_AC, EM_sim=sim_EM_pump, shift_Hz=shift_Hz) # plotting.plot_mode_fields(sim_AC, xlim_min=0.4, xlim_max=0.4, # ylim_min=0.7, ylim_max=0.0, EM_AC='AC', # prefix_str=prefix_str, suffix_str='_%i' %int(coat_y)) set_q_factor = 1000. SBS_gain, SBS_gain_PE, SBS_gain_MB, linewidth_Hz, Q_factors, alpha = integration.gain_and_qs( sim_EM_pump, sim_EM_Stokes, sim_AC, k_AC, EM_ival_pump=EM_ival_pump, EM_ival_Stokes=EM_ival_Stokes, AC_ival=AC_ival, fixed_Q=set_q_factor) # Construct the SBS gain spectrum, built from Lorentzian peaks of the individual modes. freq_min = 4 # np.real(sim_AC.nu_AC_all()[0])*1e-9 - 2 # GHz freq_max = 14 # np.real(sim_AC.nu_AC_all()[-1])*1e-9 + 2 # GHz plotting.gain_spectra(sim_AC, SBS_gain, SBS_gain_PE, SBS_gain_MB, linewidth_Hz, k_AC, EM_ival_pump, EM_ival_Stokes, AC_ival, freq_min=freq_min, freq_max=freq_max, prefix_str=prefix_str, suffix_str='_%i' % int(coat_y)) # Convert to GHz mode_freqs = sim_AC.nu_AC_all() * 1.e-9 # Clear memory wguide = sim_EM_pump = sim_EM_Stokes = sim_AC = None SBS_gain = SBS_gain_PE = SBS_gain_MB = linewidth_Hz = Q_factors = alpha = None print('Completed mode calculation for coating coat_y = %f' % coat_y) # Return the frequencies and simulated k_ac value in a list return mode_freqs