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.materials_dict["Vacuum"],
                            material_a=materials.materials_dict["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
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.Vacuum,            # background
                            material_a=materials.As2S3_2017_Morrison, # slot
                            material_b=materials.SiO2_2013_Laude,     # slab
                            material_c=materials.Si_2016_Smith,       # walls of slot
                            material_d=materials.SiO2_2013_Laude,     # coating
                            lc_bkg=5, lc2=2000.0, lc3=1000.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[EM_ival_pump] - sim_EM_Stokes.Eig_values[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.plt_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.Eig_values[0])*1e-9 - 2  # GHz
    freq_max = 14 # np.real(sim_AC.Eig_values[-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.Eig_values*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
slab_a_x = 2000
slab_a_y = 100

num_modes_EM_pump = 20
num_modes_EM_Stokes = num_modes_EM_pump
num_modes_AC = 40
EM_ival_pump = 0
EM_ival_Stokes = 0
AC_ival = 'All'

prefix_str = 'tut_07-'

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.Vacuum,            # background
                        material_a=materials.As2S3_2017_Morrison, # slot
                        material_b=materials.SiO2_2013_Laude,     # slab
                        material_c=materials.Si_2016_Smith,       # walls of slot
                        lc_bkg=1, lc2=800.0, lc3=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)
# np.savez('wguide_data', sim_EM_pump=sim_EM_pump)
# npzfile = np.load('wguide_data.npz', allow_pickle=True)
# sim_EM_pump = npzfile['sim_EM_pump'].tolist()

sim_EM_Stokes = mode_calcs.bkwd_Stokes_modes(sim_EM_pump)
# np.savez('wguide_data2', sim_EM_Stokes=sim_EM_Stokes)
示例#4
0
num_modes_EM_pump = 20
num_modes_EM_Stokes = num_modes_EM_pump
num_modes_AC = 20
EM_ival_pump = 0
EM_ival_Stokes = 0
AC_ival = 'All'

prefix_str = 'tut_10-'

# 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.materials_dict["Vacuum"],
                        material_a=materials.materials_dict["Si_2016_Smith"],
                        material_b=materials.materials_dict["SiO2_2016_Smith"],
                        lc_bkg=1,
                        lc_refine_1=100.0,
                        lc_refine_2=5.0,
                        plt_mesh=True)

# Expected effective index of fundamental guided mode.
n_eff = wguide.material_a.n - 0.1

new_calcs = True

# Calculate Electromagnetic modes.
if new_calcs:
    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)
示例#5
0
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'

# Step 4
# Use specified parameters to create a waveguide object.
# Note use of rough mesh for demonstration purposes, and use plt_mesh=True
# to save the geometry and mesh as png files in backend/fortran/msh/
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,  # in vacuum background
    lc_refine_1=600.0,  # on cylinder surfaces
    lc_refine_2=300.0,  # on cylinder center
    plt_mesh=False)

# Explicitly remind ourselves what data we're using.
print('\nUsing material data: ', wguide.material_a)

# Step 5
# Estimate 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)
示例#6
0
# 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)
print('Ref:', wguide.material_a.doi)
示例#7
0
# Number of acoustic modes to solve for.
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])
num_modes_EM_pump = 20
num_modes_EM_Stokes = num_modes_EM_pump
num_modes_AC = 60
EM_ival_pump = 0
EM_ival_Stokes = 0
AC_ival = 'All'

prefix_str = 'lit_04-no_pillar-'

# Rotate crystal axis of Si from <100> to <110>, starting with same Si_2016_Smith data.
Si_110 = copy.deepcopy(materials.Si_2016_Smith)
# Si_110 = copy.deepcopy(materials.Si_2015_Van_Laer)
Si_110.rotate_axis(np.pi/4,'z-axis', save_rotated_tensors=True)
# 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.Vacuum,
                        material_a=Si_110, symmetry_flag=False,
                        lc_bkg=4, lc2=3000.0, lc3=2000.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)
# np.savez('wguide_data', sim_EM_pump=sim_EM_pump)
# npzfile = np.load('wguide_data.npz')
# sim_EM_pump = npzfile['sim_EM_pump'].tolist()

sim_EM_Stokes = mode_calcs.fwd_Stokes_modes(sim_EM_pump)
# np.savez('wguide_data2', sim_EM_Stokes=sim_EM_Stokes)
# npzfile = np.load('wguide_data2.npz')
# sim_EM_Stokes = npzfile['sim_EM_Stokes'].tolist()
# Optical Parameters
num_modes_EM_pump = 20
num_modes_EM_Stokes = num_modes_EM_pump
num_modes_AC = 120
EM_ival_pump = 0
EM_ival_Stokes = 0
AC_ival = 'All'

prefix_str = 'lit_01-'

# 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.materials_dict["Vacuum"],
                        material_a=materials.materials_dict["SiO2_2013_Laude"],
                        lc_bkg=1,
                        lc_refine_1=400.0,
                        lc_refine_2=50.0)

# Expected effective index of fundamental guided mode.
n_eff = 1.3

# 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.plt_mode_fields(sim_EM_pump,
                         xlim_min=0.4,
                         xlim_max=0.4,
示例#10
0
lc_list = [20,100,500,1000,1500,2000,2500]
nu_lcs = len(lc_list)
lc_bkg_list = 1*np.ones(nu_lcs)
x_axis = lc_list
conv_list = []
time_list = []
# Do not run in parallel, otherwise there are confusions reading the msh files!
for i_lc, lc_ref in enumerate(lc_list):
    start = time.time()
    print("\n Running simulation", i_lc+1, "/", nu_lcs)
    lc3 = lc_ref/2
    lc_bkg = lc_bkg_list[i_lc]
    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.Vacuum,
                        material_a=materials.Al21GaAs, # waveguide
                        material_b=materials.Sapphire,     # slab
                        material_c=materials.Sapphire,     # coating
                        lc_bkg=lc_bkg, lc2=lc_ref, lc3=lc3, lc4=lc_ref, force_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)
    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])
    # Calculate Acoustic modes.
    sim_AC = wguide.calc_AC_modes(num_modes_AC, k_AC, EM_sim=sim_EM_pump)
    # Calculate interaction integrals and SBS gain.
num_modes_EM_pump = 20
num_modes_EM_Stokes = num_modes_EM_pump
num_modes_AC = 60
EM_ival_pump = 0
EM_ival_Stokes = 0
AC_ival = 'All'

prefix_str = 'lit_05-'

# Rotate crystal axis of Si from <100> to <110>, starting with same Si_2016_Smith data.
Si_110 = copy.deepcopy(materials.materials_dict["Si_2016_Smith"])
Si_110.rotate_axis(np.pi/4,'y-axis', save_rotated_tensors=True)
# 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.materials_dict["Vacuum"],
                        material_a=Si_110, symmetry_flag=False,
                        lc_bkg=1, lc_refine_1=1200.0, lc_refine_2=800.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)
# np.savez('wguide_data', sim_EM_pump=sim_EM_pump)
# npzfile = np.load('wguide_data.npz')
# sim_EM_pump = npzfile['sim_EM_pump'].tolist()

sim_EM_Stokes = mode_calcs.fwd_Stokes_modes(sim_EM_pump)
# np.savez('wguide_data2', sim_EM_Stokes=sim_EM_Stokes)
# npzfile = np.load('wguide_data2.npz')
# sim_EM_Stokes = npzfile['sim_EM_Stokes'].tolist()
示例#12
0
nu_lcs = 7
lc_bkg_list = 8*np.ones(nu_lcs)
lc_list = [100,500,1000,1500,2000,2500,3000]
x_axis = lc_list
conv_list = []
time_list = []
# Do not run in parallel, otherwise there are confusions reading the msh files!
for i_lc, lc_ref in enumerate(lc_list):
    start = time.time()
    print("\n Running simulation", i_lc+1, "/", nu_lcs)
    lc3 = lc_ref
    lc_bkg = lc_bkg_list[i_lc]
    wguide = objects.Struct(unitcell_x,inc_a_x,unitcell_y,
                            inc_a_y,inc_shape,
                            material_bkg=materials.Vacuum,
                            material_a=materials.Si_2016_Smith,
                            lc_bkg=lc_bkg, lc2=lc_ref, lc3=lc3, force_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)
    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])
    # Calculate Acoustic modes.
    sim_AC = wguide.calc_AC_modes(num_modes_AC, k_AC, EM_sim=sim_EM_pump)
    # Calculate interaction integrals and SBS gain.
    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)
# Number of acoustic modes to solve for.
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.Vacuum,
                        material_a=materials.Si_2016_Smith,
                        lc_bkg=1,
                        lc2=1000.0,
                        lc3=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.
EM_ival_Stokes = 0
# The AC mode(s) for which to calculate interaction with EM modes.
AC_ival = 'All'

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,
    material_bkg=materials.Vacuum,
    material_a=materials.As2S3_2017_Morrison,  # waveguide
    material_b=materials.SiO2_2016_Smith,  # slab
    lc_bkg=1,
    lc2=800.0,
    lc3=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()
# The AC mode(s) for which to calculate interaction with EM modes.
AC_ival = 'All'

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)
示例#16
0
inc_a_y = 0.9 * inc_a_x
inc_shape = 'rectangular'

num_modes_EM_pump = 20
num_modes_EM_Stokes = num_modes_EM_pump
num_modes_AC = 20
EM_ival_pump = 0
EM_ival_Stokes = 0
AC_ival = 'All'

# 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.Vacuum,
                        material_a=materials.Si_test_anisotropic,
                        lc_bkg=1,
                        lc2=1000.0,
                        lc3=5.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)
# Print the wavevectors of EM modes.
print('\n k_z of EM modes \n', np.round(np.real(sim_EM_pump.Eig_values), 4))
# Calculate the Electromagnetic modes of the Stokes field.
# For an idealised backward SBS simulation the Stokes modes are identical
# to the pump modes but travel in the opposite direction.
# 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'

# Si_110 = copy.deepcopy(materials.materials_dict["Si_2015_Van_Laer"])
Si_110 = copy.deepcopy(materials.get_material("Si_2016_Smith")
Si_110.rotate_axis(np.pi/4,'y-axis', save_rotated_tensors=True)

prefix_str = 'lit_07-'

# 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,
                        material_bkg=materials.get_material("Vacuum"),
                        material_a=Si_110,
                        material_b=Si_110, symmetry_flag=False,
                        lc_bkg=1, lc_refine_1=2000.0, lc_refine_2=1000.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)
# np.savez('wguide_data', sim_EM_pump=sim_EM_pump)
# npzfile = np.load('wguide_data.npz')
# sim_EM_pump = npzfile['sim_EM_pump'].tolist()

sim_EM_Stokes = mode_calcs.fwd_Stokes_modes(sim_EM_pump)

plotting.plot_mode_fields(sim_EM_pump, xlim_min=0.4, xlim_max=0.4, ivals=[EM_ival_pump], 
                         ylim_min=0.3, ylim_max=0.3, EM_AC='EM_E', num_ticks=3,
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.Si_2015_Van_Laer)
Si_110 = copy.deepcopy(materials.Si_2016_Smith)
Si_110.rotate_axis(np.pi/4,'z-axis', save_rotated_tensors=True)

prefix_str = 'lit_08-'

# 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.Vacuum,
                        material_a=Si_110, #plt_mesh=True,
                        material_b=Si_110, material_c=materials.Vacuum,
                        material_d=materials.Vacuum, material_e=materials.Vacuum,
                        symmetry_flag=False,
                        lc_bkg=lc_bkg, lc2=lc2, lc3=lc3,
                        lc4=lc4, lc5=lc5, lc6=lc6)
# 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')
# sim_EM_pump = npzfile['sim_EM_pump'].tolist()

sim_EM_Stokes = mode_calcs.fwd_Stokes_modes(sim_EM_pump)
# np.savez('wguide_data2', sim_EM_Stokes=sim_EM_Stokes)
lc_bkg_list = 1 * np.ones(nu_lcs)
x_axis = lc_list
conv_list = []
time_list = []
# Do not run in parallel, otherwise there are confusions reading the msh files!
for i_lc, lc_ref in enumerate(lc_list):
    start = time.time()
    print("\n Running simulation", i_lc + 1, "/", nu_lcs)
    lc_refine_2 = lc_ref / 2
    lc_bkg = lc_bkg_list[i_lc]
    wguide = objects.Struct(
        unitcell_x,
        inc_a_x,
        unitcell_y,
        inc_a_y,
        inc_shape,
        material_bkg=materials.materials_dict["Vacuum"],
        material_a=materials.materials_dict["Si_2016_Smith"],
        lc_bkg=lc_bkg,
        lc_refine_1=lc_ref,
        lc_refine_2=lc_refine_2,
        force_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)
    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])
    # Calculate Acoustic modes.
    sim_AC = wguide.calc_AC_modes(num_modes_AC, k_AC, EM_sim=sim_EM_pump)
示例#20
0
num_modes_EM_pump = 20
num_modes_EM_Stokes = num_modes_EM_pump
num_modes_AC = 20
EM_ival_pump = 0
EM_ival_Stokes = 0
AC_ival = 'All'

prefix_str = 'tut_10-'

# 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.Vacuum,
                        material_a=materials.Si_2016_Smith,
                        material_b=materials.SiO2_2016_Smith,
                        lc_bkg=2,
                        lc2=200.0,
                        lc3=5.0,
                        plt_mesh=False)

# 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)
# np.savez('wguide_data', sim_EM_pump=sim_EM_pump)
# npzfile = np.load('wguide_data.npz')
# sim_EM_pump = npzfile['sim_EM_pump'].tolist()
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

# 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)
sim_EM_pump.set_r0_offset(3.0e-6, -2.250e-6)
num_modes_EM_pump = 20
num_modes_EM_Stokes = num_modes_EM_pump
# Number of acoustic modes to solve for.
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.materials_dict["Vacuum"],
                        material_a=materials.materials_dict["Si_2016_Smith"],
                        lc_bkg=1, lc_refine_1=1000.0, lc_refine_2=400.0,
                        make_mesh_now = False, mesh_file='../backend/fortran/msh/4testing.mail')

# 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])

# Calculate Acoustic Modes
sim_AC_wguide = wguide.calc_AC_modes(num_AC_modes, k_AC=k_AC, EM_sim=sim_EM_pump)
示例#23
0
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)
# Expected effective index of fundamental guided mode.
n_eff = wguide.material_a.n-0.1

# Calculate Electromagnetic Modes
print("starting EM pump modes")
sim_EM_pump = wguide.calc_EM_modes(num_modes_EM_pump, wl_nm, n_eff=n_eff, debug=True)
#np.savez('wguide_data', sim_EM_pump=sim_EM_pump)
# npzfile = np.load('wguide_data.npz', allow_pickle=True)
# sim_EM_pump = npzfile['sim_EM_pump'].tolist()
# The AC mode(s) for which to calculate interaction with EM modes.
AC_ival = 'All'

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.Vacuum,
    material_a=materials.As2S3_2017_Morrison,  # waveguide
    material_b=materials.SiO2_2016_Smith,  # slab
    material_c=materials.SiO2_2016_Smith,  # coating
    lc_bkg=5,
    lc2=2000.0,
    lc3=1000.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)
示例#25
0
# 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'

# Step 4
# Use specified parameters to create a waveguide object.
# Note use of rough mesh for demonstration purposes, and use plt_mesh=True
# to save the geometry and mesh as png files in backend/fortran/msh/
wguide = objects.Struct(unitcell_x,inc_a_x,unitcell_y,inc_a_y,inc_shape,
                        material_bkg=materials.Vacuum,
                        material_a=materials.Si_2016_Smith,
                        lc_bkg=1, # in vacuum background
                        lc2=600.0, # on cylinder surfaces
                        lc3=300.0, # on cylinder center
                        plt_mesh=False)

# 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)
print('Ref:', wguide.material_a.doi)

# Step 5
# Expected effective index of fundamental guided mode.
n_eff = wguide.material_a.n-0.1

# Calculate the Electromagnetic modes of the pump field.
示例#26
0
prefix_str = 'lit_04-pillar-'

# Rotate crystal axis of Si from <100> to <110>, starting with same Si_2016_Smith data.
Si_110 = copy.deepcopy(materials.Si_2015_Van_Laer)
Si_110.rotate_axis(np.pi / 4, 'y-axis', save_rotated_tensors=True)

# Use all 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,
    pillar_x=pillar_x,
    pillar_y=pillar_y,
    material_bkg=materials.Vacuum,  # background
    material_a=Si_110,  # rib
    material_b=materials.SiO2_2015_Van_Laer,  # slab
    material_c=materials.SiO2_2015_Van_Laer,  # pillar
    lc_bkg=1,
    lc2=800.0,
    lc3=500.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)
sim_EM_Stokes = mode_calcs.fwd_Stokes_modes(sim_EM_pump)
num_modes_AC = 60
EM_ival_pump = 0
EM_ival_Stokes = 0
AC_ival = 'All'

prefix_str = 'lit_04-pillar-'

# Rotate crystal axis of Si from <100> to <110>, starting with same Si_2016_Smith data.
Si_110 = copy.deepcopy(materials.materials_dict["Si_2015_Van_Laer"])
Si_110.rotate_axis(np.pi/4,'y-axis', save_rotated_tensors=True)

# Use all 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,
                        pillar_x=pillar_x, pillar_y=pillar_y,
                        material_bkg=materials.materials_dict["Vacuum"],            # background
                        material_a=Si_110,                        # rib
                        material_b=materials.materials_dict["SiO2_2015_Van_Laer"],  # slab
                        material_c=materials.materials_dict["SiO2_2015_Van_Laer"],  # pillar
                        lc_bkg=1, lc_refine_1=800.0, lc_refine_2=500.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)
sim_EM_Stokes = mode_calcs.fwd_Stokes_modes(sim_EM_pump)

plotting.plot_mode_fields(sim_EM_pump, ivals=[EM_ival_pump],
                         xlim_min=0.4, xlim_max=0.4, ylim_min=0.4, ylim_max=0.2, 
                         EM_AC='EM_E', prefix_str=prefix_str, pdf_png='png')
示例#28
0
EM_ival_pump = 0
EM_ival_Stokes = 0
AC_ival = 'All'

if len(sys.argv)>1 and sys.argv[1]=='fast=1':  # choose between faster or more accurate calculation
  prefix_str = 'ftut_11b-'
  refine_fac=1
else:
  prefix_str = 'tut_11b-'
  refine_fac=5

# 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("Si_2016_Smith"),
                        material_b=materials.get_material("SiO2_2016_Smith"),
                        lc_bkg=1, lc_refine_1=20.0*refine_fac, lc_refine_2=1.0*refine_fac, plt_mesh=False)


# Expected effective index of fundamental guided mode.
n_eff = wguide.material_a.n-0.1

new_calcs=True

# Calculate Electromagnetic modes.
if new_calcs:
  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)
示例#29
0
# Number of acoustic modes to solve for.
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.materials_dict["Vacuum"],
                        material_a=materials.materials_dict["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])
        1] == 'fast=1':  # choose between faster or more accurate calculation
    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]:')