Commit aac18c2a authored by Lucas Laplanche's avatar Lucas Laplanche
Browse files

Merge remote-tracking branch 'origin/master'

parents e7624564 44da8d0a
......@@ -33,8 +33,6 @@ def refra(bypass_dbr=True, electric_field=0., wavelength=850e-9):
plt.plot_refra(sl)
def al_doping(bypass_dbr=True):
sl = st.structure_eam_vcsel(eam_only=True, bypass_dbr=bypass_dbr)
plt.plot_al_doping(sl)
......@@ -47,7 +45,7 @@ def reflectivity(bypass_dbr=True,
stop_wavelength=900e-9,
electric_field=0.,
n_points=100,
l_eam_clad=8e-9,
l_eam_clad=10e-9,
l_vcsel_clad=15e-9,
plot=True):
wavelength = np.linspace(start_wavelength, stop_wavelength, num=n_points)
......@@ -73,29 +71,6 @@ def reflectivity(bypass_dbr=True,
return r
def dbr_reflectivity(start_wavelength=700e-9,
stop_wavelength=1000e-9,
electric_field=0.,
n_points=100,
plot=True):
wavelength = np.linspace(start_wavelength, stop_wavelength, num=n_points)
r = np.zeros(len(wavelength))
# wavelength in [m]
# wavelength must be a numpy array
for i in tqdm(range(len(wavelength))):
sl = st.structure_dbr(period=20, grading_type = 'linear slope')
sl = op.algaas_super_lattice_refractive_index(sl, electric_field, wavelength[i], lengyel=True)
n = sl['refractive_index'].to_numpy(dtype=np.complex128)
d = sl['thickness'].to_numpy(dtype=float)
r[i] = tmm.reflection(n, d, wavelength[i])
if plot:
plt.plot_reflectivity(wavelength, r)
else:
return
def reflectivity_heatmap(bypass_dbr=True,
......@@ -199,16 +174,6 @@ def clad_coupling_electromagnetic_amplitude(bypass_dbr=False, electric_field=0.,
plt.plot_refra_clad_coupling_em(sl1, sl2, sl3)
def animation_clad_coupling(bypass_dbr=False, electric_field=0., wavelength=850e-9):
cladding = np.linspace(9.9e-9, 10.1e-9, 9)
for cl in cladding:
sl = st.structure_eam_vcsel(bypass_dbr=bypass_dbr, vcsel_only=True, grading_type='none', mqw_alloy_type='none', l_vcsel_clad=cl)
sl = op.algaas_super_lattice_refractive_index(sl, electric_field, wavelength)
sl = pt.cut_in_equal_layers_thickness(sl, 5e-9)
em = tmm.em_amplitude_scattering_matrix(sl, wavelength)
sl.insert(sl.shape[1], 'electromagnetic_amplitude', value=em)
plt.plot_refra_em(sl, str(cl))
def zandberg_electromagnetic_amplitude(electric_field=0., wavelength=1e-6):
......@@ -273,7 +238,7 @@ def ftir_theory_comparison_reflectivity(filename='eam_2', electric_field=0., doc
def mqw_psi(lz=0.01e-9):
sl = st.structure_eam_vcsel(eam_mqw_only=True, amount_eam_qw=5)
sl = st.structure_eam_vcsel(amount_eam_qw=5)
sl = pt.cut_in_equal_layers_thickness(sl, lz)
v_e, v_hh, eig_e, psi_e, eig_hh, psi_hh = qt.solve_schrodinger(sl)
np.savez_compressed('v_e', v_e)
......
......@@ -247,10 +247,6 @@ def reflectivity_heatmap(bypass_dbr=True,
v_ga11=850,
v_al5=900,
v_al12=150):
# refractive indices at 550°C
# loads al_array, wavelength_array, n_array (real part) and k_array (imaginary part)
refra_data_550 = np.load('data/550C_AlGaAs_refractive_indices/indices_arrays.npz')
# create the wavelength array
wavelength = np.linspace(start_wavelength, stop_wavelength, num=n_wavelength)
......@@ -285,11 +281,13 @@ def reflectivity_heatmap(bypass_dbr=True,
for i in tqdm(range(n_time)):
sl_i = pdt.cut_sl_at_time(sl, time[i])
sl_arrays_i = pdt.extract_arrays_from_super_lattice(sl_i)
# wavelength in [m]
# wavelength must be a numpy array
for j in range(len(wavelength)):
n, d = op.algaas_super_lattice_refractive_index_opti(sl_arrays_i, wavelength[j], refra_data_550, temperature=550+273.15)
sl_j = op.algaas_super_lattice_refractive_index(sl_i, electric_field, wavelength[j], temperature=550+273.15, lengyel=False, only_real=True)
n = sl_j['refractive_index'].to_numpy(dtype=np.complex128)
d = sl_j['thickness'].to_numpy(dtype=np.complex128)
r[j, i] = tmm.reflection(n, d, wavelength[j])
......
......@@ -5,8 +5,8 @@ import numpy as np
# physical constants
C = 299792458.0 # speed of light [m/s]
Q = 1.602176634e-19 # Electron Charge [C] 1C = 1A*1s
M0 = 9.1095e-31 # Electron rest mass [kg]
Q = 1.602176634e-19 # electron Charge [C] 1C = 1A*1s
M0 = 9.1095e-31 # electron rest mass [kg]
HREV = 6.582119569e-16 # Reduced Plank constant [eV.s]
HRJ = 1.054571817e-34 # Reduced Plank constant [J.s]
HEV = 4.135667696e-15 # Plank constant [eV.s]
......@@ -27,6 +27,11 @@ NAL = 2.5702 # Al refractive index at 852.1nm
NALOX = 1.6 # oxided Al refractive index
# refractive indices at 550°C
# loads al_array, wavelength_array, n_array (real part) and k_array (imaginary part)
REFRA_DATA_550 = np.load('data/550C_AlGaAs_refractive_indices/indices_arrays.npz')
# distributed Bragg Reflectors constants @ 850nm
L_15_AL_DBR = 6.07310545767979e-08
L_90_AL_DBR = 6.995041869479308e-08
......
......@@ -35,6 +35,8 @@ def eam_heatmaps():
r_file_name='heatmap_r_eam_2')
def reflectivity_eam_vcsel_clad_heatmap():
n_pts = 30
l_eam_clad =np.linspace(15, 20, num=n_pts)
......@@ -59,6 +61,8 @@ def reflectivity_eam_vcsel_clad_heatmap():
plt.plot_std_heatmap(l_eam_clad, l_vcsel_clad, r)
def structure_for_matlab(vcsel_only=False, bypass_dbr=False, wavelength=850.5e-9):
l_eam_clad = 5e-9
l_vcsel_clad = 15e-9
......@@ -70,5 +74,3 @@ def structure_for_matlab(vcsel_only=False, bypass_dbr=False, wavelength=850.5e-9
n = sl['refractive_index'].apply(np.real).to_numpy(dtype=float)
scipy.io.savemat('eam_vcsel_n_lz.mat', dict(n=n, lz=lz))
import numpy as np
from globals import C, HEV, NALOX, N0, T
from globals import C, HEV, NALOX, N0, REFRA_DATA_550, T
from sqw_lengyel_absorption import gaas_sqw_absorption_at_wavelength
from time import time as tm
def algaas_super_lattice_refractive_index_opti(super_lattice_arrays, wavelength, refra_data_550, temperature=T):
[name_array, al_array, thickness_array, r_array] = super_lattice_arrays
start = tm()
for i in range(al_array.shape[0]):
name = name_array[i]
al = al_array[i]
if 'air' in name:
r_array[i] = N0
# layer is NOT a quantum well
else:
# refractive index value
if temperature == 550 + 273.15:
n = almuneau_complex_550C_algaas_refractive_index(refra_data_550, al, wavelength, temperature=temperature)
else:
n = afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=temperature)
r_array[i] = n
print('s = ', tm() - start)
return r_array, thickness_array
def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelength, temperature=T, lengyel=True, only_real=False):
# wavelength in [m]
# temperature in [K]
# lengyel : activate the Lengyel model for the calculation of QW absorption
if only_real:
......@@ -80,7 +51,7 @@ def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelen
# qw thickness
thickness = super_lattice.at[i, 'thickness']
if lengyel:
if lengyel :
k = gaas_sqw_absorption_at_wavelength(al, thickness, electric_field, wavelength)
else:
k = 0.
......@@ -126,88 +97,6 @@ def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelen
return super_lattice
def algaas_refractive_index(al, electric_field, wavelength, quantum_well=False, quantum_well_thickness=0., confinement_barrier_al=0., na=0., nd=0.):
# layer is a quantum well -> Lengyel model
if quantum_well:
# refractive index value
n = afromovitz_varshni_real_algaas_refractive_index(0., wavelength)
k = gaas_sqw_absorption_at_wavelength(confinement_barrier_al, quantum_well_thickness, electric_field, wavelength)
k = -100*k*wavelength/(4*np.pi)
n += 1j*k
# layer is NOT a quantum well
else:
# refractive index value
n = afromovitz_varshni_real_algaas_refractive_index(al, wavelength)
if (na == 0.) & (na == nd):
pass
# N doped
elif nd > na:
n += -1j*5e-18*nd*1e-4*wavelength/(4*np.pi)
# P doped
elif na > nd:
n += -1j*11.5e-18*na*1e-4*wavelength/(4*np.pi)
return n
def afromovitz_real_algaas_refractive_index(al, wavelength):
# Refractive index of AlGaAs for all compositions
# as a function of temperature and for wavelengths
# below bandgap or slightly above bandgap (Afromovitz model)
# References:
# M.A.Afromovitz J.P.Kim et al, Optics Letters, V32 N5, p536(2007)
# al content [1]
# wavelength in [m]
# T [°C]
t = T -273.15 # [K] -> [°C]
wavelength = wavelength/1e-6
e0 = 3.65 +0.871*al +0.179*al**2 # [eV]
ed = 36.1 -2.45*al # [eV]
e_gamma = 1.424 +1.266*al +0.26*al**2 -((1 -al)*0.5405 +al*0.885)*1e-3 *(t -25) # [eV]
ef = np.sqrt(2*e0**2 -e_gamma**2) # [eV]
eta = np.pi*ed/(2*e0**3*(e0**2 -e_gamma**2))
ma = eta*(ef**4 -e_gamma**4)/(2*np.pi)
mb = eta*(ef**2 -e_gamma**2)/np.pi
e = 1.239852066/wavelength # [eV]
e_gamma_p = e_gamma -0.025
k = 0.35
if e>e_gamma:
n = np.sqrt(1 +ma +mb*e_gamma_p**2 +eta*e_gamma_p**4*np.log((ef**2 -e_gamma_p**2)/(e_gamma**2 -e_gamma_p**2))/np.pi) +k*(e -e_gamma_p)
else:
n = np.sqrt(1 +ma +mb*e**2 +eta*e**4*np.log((ef**2 -e**2)/(e_gamma**2 -e**2))/np.pi)
n = n*(1 +((1 -al)*0.5405 +al*0.885)*1e-3*(t -25)/(4*e_gamma))
return n
def afromovitz_simplified_real_algaas_refractive_index(al, wavelength):
#e_g = 1.424 +1.266*al +0.26*al**2
#e_0 = 2.6 +3*e_g/4
e_0 = 3.65 +0.871*al +0.179*al**2
e_d = 36.1 -2.45*al
e = HEV*C/wavelength
frac = e_0*e_d/(e_0**2 -e**2)
n = np.sqrt(1 +frac)
return n
def afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=T):
......@@ -250,26 +139,27 @@ def afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=
return n
def almuneau_complex_550C_algaas_refractive_index(refra_data_550, al, wavelength, temperature=550+273.15):
def almuneau_complex_550C_algaas_refractive_index(al, wavelength, temperature=550+273.15):
if temperature != 550+273.15 :
print('error : temperature out of range')
n = barycenter(al, refra_data_550['al_array'], wavelength, refra_data_550['wavelength_array'], refra_data_550['n_array'])
k = barycenter(al, refra_data_550['al_array'], wavelength, refra_data_550['wavelength_array'], refra_data_550['k_array'])
if 'refra_data_550' in globals() :
pass
else :
global refra_data_550
refra_data_550 = REFRA_DATA_550
return n + 1j * k
idx_al = find_nearest_index(al, refra_data_550['al_array'])
idx_wavelength = find_nearest_index(wavelength, refra_data_550['wavelength_array'])
def ioffe_algaas_permittivity(al, high_frequency=True):
if high_frequency:
mu = 10.89 - 2.73 * al
else:
mu = 12.90 - 2.84 * al
n = refra_data_550['n_array'][idx_wavelength, idx_al]
k = refra_data_550['k_array'][idx_wavelength, idx_al]
return mu
return n + 1j * k
......@@ -308,57 +198,3 @@ def confinement_barrier_mean_al_content(super_lattice, i):
return al
def confinement_barrier_mean_al_content_array(name_array, al_array, thickness_array, i):
name = name_array[i +1]
al = 0.
total_thickness = 0.
while 'barrier' in name:
al += al_array[i +1] * thickness_array[i +1]
total_thickness += thickness_array[i +1]
i += 1
name = name_array[i +1]
al = al / total_thickness
return al
def find_two_nearest_indices(value, array):
# array must be a numpy array
idx0 = (np.abs(array -value)).argmin()
if idx0 == 0 :
idx1 = 1
elif idx0 == (len(array) -1) :
idx1 = len(array) -2
elif np.abs(array[idx0 +1] -value) < np.abs(array[idx0 -1] -value) :
idx1 = idx0 +1
else :
idx1 = idx0 -1
return idx0, idx1
def barycenter(al, al_array, wavelength, wavelength_array, value_array):
al_i0, al_i1 = find_two_nearest_indices(al, al_array)
wave_i0, wave_i1 = find_two_nearest_indices(wavelength, wavelength_array)
coeff_al_i0 = np.abs(al - al_array[al_i1]) / np.abs(al_array[al_i0] - al_array[al_i1])
coeff_al_i1 = np.abs(al - al_array[al_i0]) / np.abs(al_array[al_i0] - al_array[al_i1])
coeff_wave_i0 = np.abs(wavelength - wavelength_array[wave_i1]) / np.abs(wavelength_array[wave_i0] - wavelength_array[wave_i1])
coeff_wave_i1 = np.abs(wavelength - wavelength_array[wave_i0]) / np.abs(wavelength_array[wave_i0] - wavelength_array[wave_i1])
value = value_array[wave_i0, al_i0] * coeff_al_i0 * coeff_wave_i0
value += value_array[wave_i0, al_i1] * coeff_al_i1 * coeff_wave_i0
value += value_array[wave_i1, al_i0] * coeff_al_i0 * coeff_wave_i1
value += value_array[wave_i1, al_i1] * coeff_al_i1 * coeff_wave_i1
value /= 4
return value
OBJECTIFS
Nettoyer le code de la structure python.
Traiter les courbes mesurées de la refléctivité temporelle.
Les comparer aux calculs théoriques.
Faire l'épitaxie.
Faire le fit du FTIR.
Vérifier les recettes avec Alexandre
Faire l'épitaxie.
ACCOMPLI
Nettoyer le code de la structure python.
Faire les calculs VCSEL EAM avec oxydation eam.
Modifier la fiche process pour rajouter les étapes d'oxidation.
Réinstaller crystal XE et faire les recettes EAM-VCSELs.
Vérifier quelles cellules sont ouvertes lors de l'éptiaxie d'un puit, et corriger le code en conséquence.
Déterminer quels masques doivent etre en positif ou negatif.
Corriger le tmm !!!!!!!!!
ECHOUÉ
FTIR.
Calcul carte de chaleur reflectivité
\ No newline at end of file
QUESTIONS
......@@ -3,5 +3,141 @@ import super_lattice_structure as sls
def structure_boolean_arg_dict(config):
# boolean setup
# overwrite default config
if 'vcsel_only' in config :
arg_dict = {
'vcsel_only': True,
'eam_only': False,
'air' : True,
'top_contact' : False,
'top_eam_dbr' : False,
'eam_alox' : False,
'eam_mqw' : False,
'bypass_dbr' : False,
'bot_eam_dbr' : False,
'middle_contact' : True,
'shared_dbr' : True,
'vcsel_alox' : True,
'vcsel_mqw' : True,
'bot_vcsel_dbr' : True,
'substrate' : True
}
elif 'eam_only' in config :
arg_dict = {
'vcsel_only': False,
'eam_only': True,
'air' : True,
'top_contact' : True,
'top_eam_dbr' : True,
'eam_alox': False,
'eam_mqw' : True,
'bypass_dbr': False,
'bot_eam_dbr' : True,
'middle_contact' : True,
'shared_dbr' : True,
'vcsel_alox' : False,
'vcsel_mqw' : False,
'bot_vcsel_dbr' : False,
'substrate' : True
}
elif 'eam_mqw_only' in config :
arg_dict = {
'vcsel_only' : False,
'eam_only' : True,
'air' : False,
'top_contact' : False,
'top_eam_dbr' : False,
'eam_alox' : False,
'eam_mqw' : True,
'bypass_dbr': False,
'bot_eam_dbr' : False,
'middle_contact' : False,
'shared_dbr' : False,
'vcsel_alox' : False,
'vcsel_mqw' : False,
'bot_vcsel_dbr' : False,
'substrate' : False
}
else:
arg_dict = {
'vcsel_only': False,
'eam_only': False,
'air' : True,
'top_contact' : True,
'top_eam_dbr' : True,
'eam_alox' : True,
'eam_mqw' : True,
'bypass_dbr' : False,
'bot_eam_dbr' : True,
'middle_contact' : True,
'shared_dbr' : True,
'vcsel_alox' : True,
'vcsel_mqw' : True,
'bot_vcsel_dbr' : True,
'substrate' : True
}
return arg_dict
def eam_classic():
arg_dict = structure_boolean_arg_dict('eam_only')
return sls.structure_eam_vcsel(**arg_dict)
def eam_bypass():
arg_dict = structure_boolean_arg_dict('eam_only')
arg_dict['bypass_dbr'] = True
return sls.structure_eam_vcsel(**arg_dict)
def eam_alox():
return sls.structure_eam_vcsel(eam_alox=True, bypass_dbr=True, eam_only=True)
\ No newline at end of file
arg_dict = structure_boolean_arg_dict('eam_only')
arg_dict['eam_alox'] = True
arg_dict['bypass_dbr'] = True
return sls.structure_eam_vcsel(**arg_dict)
def eam_vcsel_classic():
arg_dict = structure_boolean_arg_dict('eam_vcsel')
return sls.structure_eam_vcsel(**arg_dict)
def eam_vcsel_bypass():
arg_dict = structure_boolean_arg_dict('eam_vcsel')
arg_dict['bypass_dbr'] = True
return sls.structure_eam_vcsel(**arg_dict)
def eam_vcsel_alox():
arg_dict = structure_boolean_arg_dict('eam_vcsel')
arg_dict['eam_alox'] = True
arg_dict['bypass_dbr'] = True
return sls.structure_eam_vcsel(**arg_dict)
def vcsel():
arg_dict = structure_boolean_arg_dict('vcsel_only')
return sls.structure_eam_vcsel(**arg_dict)
\ No newline at end of file
......@@ -10,14 +10,13 @@ import optic as op
def structure_eam_vcsel(vcsel_only = False,
eam_only = False,
eam_mqw_only = False,
air = True,
top_contact = True,
top_eam_dbr = True,
eam_alox = False,
eam_mqw = True,
bypass_dbr = True,
bypass_dbr = False,
bot_eam_dbr = True,
middle_contact = True,
shared_dbr = True,
......@@ -56,47 +55,6 @@ def structure_eam_vcsel(vcsel_only = False,
# speeds are in [nm/h]
# prioritary boolean setup
# overwrite default config
if vcsel_only:
air = True
top_contact = False
top_eam_dbr = False
eam_alox = False
eam_mqw = False
bypass_dbr = False
bot_eam_dbr = False
middle_contact = True
shared_dbr = True
vcsel_alox = True
vcsel_mqw = True
bot_vcsel_dbr = True
substrate = True
elif eam_only:
air = True
top_contact = True
top_eam_dbr = True
eam_mqw = True
bot_eam_dbr = True
middle_contact = True
shared_dbr = True
vcsel_alox = False
vcsel_mqw = False
bot_vcsel_dbr = False
substrate = True
elif eam_mqw_only:
air = False
top_contact = False
top_eam_dbr = False
eam_alox = False
eam_mqw = True
bot_eam_dbr = False
middle_contact = False
shared_dbr = False
vcsel_alox = False
vcsel_mqw = False
bot_vcsel_dbr = False
substrate = False
# super lattice
......@@ -135,7 +93,7 @@ def structure_eam_vcsel(vcsel_only = False,