Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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])
Ejemplo n.º 3
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)
Ejemplo n.º 4
0
# 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()
Ejemplo n.º 8
0
    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):
Ejemplo n.º 9
0
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)
Ejemplo n.º 11
0
    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)
Ejemplo n.º 12
0
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