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): ...@@ -33,8 +33,6 @@ def refra(bypass_dbr=True, electric_field=0., wavelength=850e-9):
plt.plot_refra(sl) plt.plot_refra(sl)
def al_doping(bypass_dbr=True): def al_doping(bypass_dbr=True):
sl = st.structure_eam_vcsel(eam_only=True, bypass_dbr=bypass_dbr) sl = st.structure_eam_vcsel(eam_only=True, bypass_dbr=bypass_dbr)
plt.plot_al_doping(sl) plt.plot_al_doping(sl)
...@@ -47,7 +45,7 @@ def reflectivity(bypass_dbr=True, ...@@ -47,7 +45,7 @@ def reflectivity(bypass_dbr=True,
stop_wavelength=900e-9, stop_wavelength=900e-9,
electric_field=0., electric_field=0.,
n_points=100, n_points=100,
l_eam_clad=8e-9, l_eam_clad=10e-9,
l_vcsel_clad=15e-9, l_vcsel_clad=15e-9,
plot=True): plot=True):
wavelength = np.linspace(start_wavelength, stop_wavelength, num=n_points) wavelength = np.linspace(start_wavelength, stop_wavelength, num=n_points)
...@@ -73,29 +71,6 @@ def reflectivity(bypass_dbr=True, ...@@ -73,29 +71,6 @@ def reflectivity(bypass_dbr=True,
return r 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, def reflectivity_heatmap(bypass_dbr=True,
...@@ -199,16 +174,6 @@ def clad_coupling_electromagnetic_amplitude(bypass_dbr=False, electric_field=0., ...@@ -199,16 +174,6 @@ def clad_coupling_electromagnetic_amplitude(bypass_dbr=False, electric_field=0.,
plt.plot_refra_clad_coupling_em(sl1, sl2, sl3) 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): 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 ...@@ -273,7 +238,7 @@ def ftir_theory_comparison_reflectivity(filename='eam_2', electric_field=0., doc
def mqw_psi(lz=0.01e-9): 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) 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) v_e, v_hh, eig_e, psi_e, eig_hh, psi_hh = qt.solve_schrodinger(sl)
np.savez_compressed('v_e', v_e) np.savez_compressed('v_e', v_e)
......
...@@ -247,10 +247,6 @@ def reflectivity_heatmap(bypass_dbr=True, ...@@ -247,10 +247,6 @@ def reflectivity_heatmap(bypass_dbr=True,
v_ga11=850, v_ga11=850,
v_al5=900, v_al5=900,
v_al12=150): 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 # create the wavelength array
wavelength = np.linspace(start_wavelength, stop_wavelength, num=n_wavelength) wavelength = np.linspace(start_wavelength, stop_wavelength, num=n_wavelength)
...@@ -285,11 +281,13 @@ def reflectivity_heatmap(bypass_dbr=True, ...@@ -285,11 +281,13 @@ def reflectivity_heatmap(bypass_dbr=True,
for i in tqdm(range(n_time)): for i in tqdm(range(n_time)):
sl_i = pdt.cut_sl_at_time(sl, time[i]) 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 in [m]
# wavelength must be a numpy array # wavelength must be a numpy array
for j in range(len(wavelength)): 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]) r[j, i] = tmm.reflection(n, d, wavelength[j])
......
...@@ -5,8 +5,8 @@ import numpy as np ...@@ -5,8 +5,8 @@ import numpy as np
# physical constants # physical constants
C = 299792458.0 # speed of light [m/s] C = 299792458.0 # speed of light [m/s]
Q = 1.602176634e-19 # Electron Charge [C] 1C = 1A*1s Q = 1.602176634e-19 # electron Charge [C] 1C = 1A*1s
M0 = 9.1095e-31 # Electron rest mass [kg] M0 = 9.1095e-31 # electron rest mass [kg]
HREV = 6.582119569e-16 # Reduced Plank constant [eV.s] HREV = 6.582119569e-16 # Reduced Plank constant [eV.s]
HRJ = 1.054571817e-34 # Reduced Plank constant [J.s] HRJ = 1.054571817e-34 # Reduced Plank constant [J.s]
HEV = 4.135667696e-15 # Plank constant [eV.s] HEV = 4.135667696e-15 # Plank constant [eV.s]
...@@ -27,6 +27,11 @@ NAL = 2.5702 # Al refractive index at 852.1nm ...@@ -27,6 +27,11 @@ NAL = 2.5702 # Al refractive index at 852.1nm
NALOX = 1.6 # oxided Al refractive index 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 # distributed Bragg Reflectors constants @ 850nm
L_15_AL_DBR = 6.07310545767979e-08 L_15_AL_DBR = 6.07310545767979e-08
L_90_AL_DBR = 6.995041869479308e-08 L_90_AL_DBR = 6.995041869479308e-08
......
...@@ -35,6 +35,8 @@ def eam_heatmaps(): ...@@ -35,6 +35,8 @@ def eam_heatmaps():
r_file_name='heatmap_r_eam_2') r_file_name='heatmap_r_eam_2')
def reflectivity_eam_vcsel_clad_heatmap(): def reflectivity_eam_vcsel_clad_heatmap():
n_pts = 30 n_pts = 30
l_eam_clad =np.linspace(15, 20, num=n_pts) l_eam_clad =np.linspace(15, 20, num=n_pts)
...@@ -59,6 +61,8 @@ def reflectivity_eam_vcsel_clad_heatmap(): ...@@ -59,6 +61,8 @@ def reflectivity_eam_vcsel_clad_heatmap():
plt.plot_std_heatmap(l_eam_clad, l_vcsel_clad, r) 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): def structure_for_matlab(vcsel_only=False, bypass_dbr=False, wavelength=850.5e-9):
l_eam_clad = 5e-9 l_eam_clad = 5e-9
l_vcsel_clad = 15e-9 l_vcsel_clad = 15e-9
...@@ -70,5 +74,3 @@ def structure_for_matlab(vcsel_only=False, bypass_dbr=False, wavelength=850.5e-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) n = sl['refractive_index'].apply(np.real).to_numpy(dtype=float)
scipy.io.savemat('eam_vcsel_n_lz.mat', dict(n=n, lz=lz)) scipy.io.savemat('eam_vcsel_n_lz.mat', dict(n=n, lz=lz))
import numpy as np 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 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): 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: if only_real:
...@@ -80,7 +51,7 @@ def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelen ...@@ -80,7 +51,7 @@ def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelen
# qw thickness # qw thickness
thickness = super_lattice.at[i, 'thickness'] thickness = super_lattice.at[i, 'thickness']
if lengyel: if lengyel :
k = gaas_sqw_absorption_at_wavelength(al, thickness, electric_field, wavelength) k = gaas_sqw_absorption_at_wavelength(al, thickness, electric_field, wavelength)
else: else:
k = 0. k = 0.
...@@ -126,88 +97,6 @@ def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelen ...@@ -126,88 +97,6 @@ def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelen
return super_lattice 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): 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= ...@@ -250,26 +139,27 @@ def afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=
return n 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 : if temperature != 550+273.15 :
print('error : temperature out of range') 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']) if 'refra_data_550' in globals() :
k = barycenter(al, refra_data_550['al_array'], wavelength, refra_data_550['wavelength_array'], refra_data_550['k_array']) 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): n = refra_data_550['n_array'][idx_wavelength, idx_al]
if high_frequency: k = refra_data_550['k_array'][idx_wavelength, idx_al]
mu = 10.89 - 2.73 * al
else:
mu = 12.90 - 2.84 * al
return mu return n + 1j * k
...@@ -308,57 +198,3 @@ def confinement_barrier_mean_al_content(super_lattice, i): ...@@ -308,57 +198,3 @@ def confinement_barrier_mean_al_content(super_lattice, i):
return al 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 OBJECTIFS
Nettoyer le code de la structure python.
Traiter les courbes mesurées de la refléctivité temporelle. Traiter les courbes mesurées de la refléctivité temporelle.
Les comparer aux calculs théoriques. Les comparer aux calculs théoriques.
Faire l'épitaxie.
Faire le fit du FTIR. Faire le fit du FTIR.
Vérifier les recettes avec Alexandre Vérifier les recettes avec Alexandre
Faire l'épitaxie.
ACCOMPLI ACCOMPLI
Nettoyer le code de la structure python.
Faire les calculs VCSEL EAM avec oxydation eam. 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. 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. Corriger le tmm !!!!!!!!!
Déterminer quels masques doivent etre en positif ou negatif.
ECHOUÉ ECHOUÉ
FTIR. FTIR.
Calcul carte de chaleur reflectivité Calcul carte de chaleur reflectivité
\ No newline at end of file
QUESTIONS
...@@ -3,5 +3,141 @@ import super_lattice_structure as sls ...@@ -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(): def eam_alox():
return sls.structure_eam_vcsel(eam_alox=True, bypass_dbr=True, eam_only=True) arg_dict = structure_boolean_arg_dict('eam_only')
\ No newline at end of file arg_dict['eam_alox'] = True