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

ajout curve fit ftir

parent 1ef18da2
......@@ -171,7 +171,7 @@ def reflectivity_from_growth_speed(v_ga6, v_ga11, v_al5, v_al12,
start_wavelength=700e-9,
stop_wavelength=1000e-9,
electric_field=0.,
n_points=300,
n_points=200,
figure=True):
# reflectivity computation parameters
wavelength = np.linspace(start_wavelength, stop_wavelength, num=n_points)
......@@ -196,6 +196,12 @@ def reflectivity_from_growth_speed(v_ga6, v_ga11, v_al5, v_al12,
r[k] = tmm.reflection(n, d, wavelength[k])
# experimental data
wavelength_exp, r_exp = ft.import_ftir_mbe_maison('A1397_centre.dat')
# slice and shrink the arrays
wavelength_exp, r_exp = resize_w_r_length(wavelength_exp, r_exp, start_wavelength, stop_wavelength, n_points)
if figure:
# figure parameters
# create a figure
......@@ -213,6 +219,14 @@ def reflectivity_from_growth_speed(v_ga6, v_ga11, v_al5, v_al12,
)
)
fig.add_trace(
go.Scatter(
x=wavelength_exp,
y=r_exp,
name='ftir measurement'
)
)
# create axis objects
fig.update_layout(
xaxis=dict(
......@@ -240,11 +254,11 @@ def reflectivity_from_growth_speed(v_ga6, v_ga11, v_al5, v_al12,
fig.show()
def reflectivity_from_growth_speed_slider(delta_speed=0.05,
n_points_slider=20,
def reflectivity_from_growth_speed_slider(delta_speed=0.2,
n_points_slider=40,
start_wavelength=700e-9,
stop_wavelength=1000e-9,
tmm_resolution=100):
tmm_resolution=300):
# reflectivity computation parameters
wavelength = np.linspace(start_wavelength, stop_wavelength, num=tmm_resolution)
r = np.zeros(len(wavelength))
......@@ -252,7 +266,7 @@ def reflectivity_from_growth_speed_slider(delta_speed=0.05,
# create the vector of different speeds [1]
speed_vector = np.linspace(1. -delta_speed, 1. +delta_speed, num=n_points_slider)
v_ga6_arr = 100.*speed_vector
v_al12_arr = 150.*speed_vector
# create figure
......@@ -260,9 +274,9 @@ def reflectivity_from_growth_speed_slider(delta_speed=0.05,
# add traces, one for each slider step
for v_ga6 in tqdm(v_ga6_arr):
for v_al12 in tqdm(v_al12_arr):
# arguments to create the corresponding structure
cells_arg = {'v_ga6': v_ga6,}
cells_arg = {'v_al12': v_al12,}
argument = stm.eam_vcsel_classic_arguments() | cells_arg
# create the structure
......@@ -283,7 +297,7 @@ def reflectivity_from_growth_speed_slider(delta_speed=0.05,
visible=False,
x=wavelength,
y=r,
name='v_ga6 = ' +str(v_ga6),
name='v_al12 = ' +str(v_al12),
)
)
......@@ -293,7 +307,7 @@ def reflectivity_from_growth_speed_slider(delta_speed=0.05,
fig.update_layout(
sliders=slider_generator('Ga6', fig.data, n_points_slider)
sliders=slider_generator('Al12', fig.data, n_points_slider)
)
......@@ -367,15 +381,19 @@ def reflectivity_heatmap(bypass_dbr=True,
def growth_speed_fit(delta_speed=0.1,
start_wavelength=700e-9,
def growth_speed_fit(delta_speed=0.2,
start_wavelength=780e-9,
stop_wavelength=1000e-9,
tmm_resolution=100):
tmm_resolution=200):
# initial guess
v_ga6 = 100.
#v_ga6 = 90.
v_ga11 = 850.
#v_ga11 = 916.
v_al5 = 900.
#v_al5 = 790.
v_al12 = 150.
#v_al12 = 165.
# initial guess object
v0 = v_ga6, v_ga11, v_al5, v_al12
......@@ -397,19 +415,18 @@ def growth_speed_fit(delta_speed=0.1,
# curve fit
# don't forget to choose in reflectivity_alias(..) the correct sl structure
# don't forget to choose in reflectivity_alias(...) the correct sl structure
# according to the type of data you import from the ftir (it should be the same structure of course !)
wavelength, r_to_fit = ft.import_ftir_mbe_maison('A1397_centre.dat')
# slice and shrink the arrays
wavelength, r_to_fit = resize_w_r_length(wavelength, r_to_fit, start_wavelength, stop_wavelength, tmm_resolution)
# normalize
r_to_fit = r_to_fit / np.max(r_to_fit)
values = curve_fit(reflectivity_alias, wavelength, r_to_fit, v0, bounds=bounds)
# print computed values
print('v_ga6 = ', values[0])
print('v_ga11 = ', values[1])
print('v_al5 = ', values[2])
print('v_al12 = ', values[3])
print(values)
......@@ -489,27 +506,27 @@ def resize_w_r_length(w, r, start_wavelength, stop_wavelength, tmm_resolution):
# calculate the difference array
difference_array = np.absolute(w - start_wavelength)
# find the index of minimum element from the array
idx_700 = difference_array.argmin()
idx_start = difference_array.argmin()
difference_array = np.absolute(w - stop_wavelength)
idx_1000 = difference_array.argmin()
idx_stop = difference_array.argmin()
# slice the arrays
w = w[idx_700:idx_1000]
r = r[idx_700:idx_1000]
w = w[idx_start:idx_stop]
r = r[idx_start:idx_stop]
# get the length of the array
l = w.shape[0]
# create an evenly spaced array of indices of length tmm_resolution
indices = np.floor(np.linspace(0, l -1, num = tmm_resolution)).astype(int)
if tmm_resolution<l:
indices = np.floor(np.linspace(0, l -1, num = tmm_resolution)).astype(int)
# shrink the arrays
w = w[indices]
r = r[indices]
# shrink the arrays
w = w[indices]
r = r[indices]
return w, r
......
import numpy as np
from globals import C, HEV, NALOX, N0, T
from globals import C, HEV, KBEV, NALOX, N0, T
from sqw_lengyel_absorption import gaas_sqw_absorption_at_wavelength
......@@ -100,9 +100,10 @@ def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelen
def afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=T):
if temperature > 373.15 or temperature < 273.15 :
print('error : temperature out of range')
# al [1]
# wavelength [m]
# temperature [K]
# for temperatures in the range [0 ; 70] +273.15 [K]
t_c = temperature -273.15
e = HEV*C/wavelength
......@@ -116,13 +117,10 @@ def afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=
e_d += (0.0306061391304348*t_c -3.62955347826087)*al**2
# Vegard
#e_g = 1.424 +1.266*al +0.26*al**2
e_g = (1 -al)*1.424 +al*3.02 -al*(1-al)*0.37
e_g = e_vegard(al)
# Varshni
alpha = (5.405 +4.038*al)*1e-4 # [eV/K]
beta = 204./370.*(370. +54.*al +22.*al**2) # [K]
e_var = e_g +alpha*298.**2/(298. +beta) -(alpha*T**2)/(T +beta) # [eV?]
e_var = e_varshni(al, e_g, temperature)
# Afromovitz
energy = e +1j*1e-2
......@@ -140,24 +138,101 @@ def afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=
def almuneau_complex_550C_algaas_refractive_index(al, wavelength, temperature=550+273.15):
if temperature != 550+273.15 :
print('error : temperature out of range')
# al [1]
# wavelength [m]
# temperature [K]
# for temperatures in the range [70 ; 700] +273.15 [K]
t_c = temperature -273.15 # [°C]
c = 2.565574613e-8
n = afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=temperature)
# Vegard
e_g = e_vegard(al)
# Varshni
e_var = e_varshni(al, e_g, temperature)
n *= (1. +((1. -al) * 0.5405 +al*0.885) * 1e-3 * (t_c -25.) / (4. * e_var))
k_j, e_g_j = johnson_abs_algaas(al, wavelength, temperature)
lambda_g = 1.239852066e-6 / e_g_j
if 'refra_model_550' in globals() :
pass
if lambda_g < wavelength :
abs_f = 2. / np.pi * 2000. * np.arctan(np.exp((1.239852066e-6 / wavelength -e_g_j) / 6e-3))
else :
global refra_model_550
refra_model_550 = REFRA_MODEL_550
abs_f = c * c_absorbtion(e_g_j) * (
np.sqrt(np.max(1.239852066e-6 / wavelength - e_g_j, 0.)) / (1.239852066e-6 / wavelength))
k = (wavelength * 1e-6 * 1e-4 / (4 * np.pi)) * abs_f
n = 1j * np.polynomial.polynomial.polyval2d(al, wavelength, refra_model_550['k'])
n += np.polynomial.polynomial.polyval2d(al, wavelength, refra_model_550['n'])
# temperature dependent bandgap, high temperature range, neglecting bowing effects
alpha_x = (5.405 +4.038 * al) * 1e-4 # [eV/K]
beta_x = 204. / 370. * (370. +54. * al +22. * al**2) # [K]
e_gamma = (1.424 +1.266 * al +0.26 * al**2 +(alpha_x * 298.**2) / (298. +beta_x)) -(alpha_x * temperature**2) / (temperature +beta_x) # [eV]
# Urbach tail model
delta_lambda_urbach = 0.05e-6 # [m]
lambda_g = 1.239852066e-6 / e_gamma
low_bound = lambda_g -delta_lambda_urbach
high_bound = lambda_g +delta_lambda_urbach
return n
def e_vegard(al):
# al content in [1]
return (1 -al)*1.424 +al*3.02 -al*(1-al)*0.37
def e_varshni(al, e_g, temperature):
# al content in [1]
# e_g in [eV]
# temperature in [K]
t_c = temperature - 273.15
alpha = (5.405 +4.038*al)*1e-4 # [eV/K]
beta = 204./370.*(370. +54.*al +22.*al**2) # [K]
e_var = e_g +alpha*298.**2/(298. +beta) -(alpha*t_c**2)/(t_c +beta) # [eV?]
return e_var
def johnson_abs_algaas(al, wavelength, temperature):
# al [1]
# wavelength [m]
# temperature [K]
t_c = temperature -273.15 # [°C]
e = 1.239852066e-6 / wavelength # [eV?]
e_g_0 = e_varshni(al, e_vegard(al), 0.) # [eV]
theta_nid = 263.
s_g_nid = 5.98
s_0_nid = 0.087
x_nid = 5.2
a = 8000.
e_0_t_nid = s_0_nid * KBEV * theta_nid * ((1. +x_nid) / 2. +1. / (np.exp(theta_nid / t_c) -1.))
e_g_t_nid = e_g_0 -s_g_nid * KBEV * theta_nid * (1. / (np.exp(theta_nid / t_c) -1.))
alpha_si = a * np.exp((e -e_g_t_nid) / e_0_t_nid)
k_nid = (wavelength * 1e-6 * 1e-4 / (4 * np.pi)) * alpha_si
return k_nid, e_g_t_nid
def c_absorbtion(e_g):
return -7.63792e-11 +2.81092e-12 * e_g
def oxidation(super_lattice, eam_mesa=True, vcsel_mesa=False):
......
OBJECTIFS
Traiter les courbes mesurées de la refléctivité temporelle.
Les comparer aux calculs théoriques.
Faire le fit du FTIR.
Implémenter le calcul d'indices de réfraction à 550°C
Processer les modulateurs.
Caractériser les modulateurs.
Faire un calcul de reflectivité, avec slider pour Al5, pour chaque vitesse de croissance d'Al5,
on aura identifié avant de calculer la réflectivité de toute la gamme de longueurs d'ondes,
quelle vitesse de croissance de Ga11 permet d'avoir la résonnance FP obtenue en FTIR
ACCOMPLI
Nettoyer le code de la structure python.
Faire les calculs VCSEL EAM avec oxydation eam.
Réinstaller crystal XE et faire les recettes EAM-VCSELs.
Corriger le scattering tmm !!!!!!!!!
Corriger le scattering tmm !
Vérifier les recettes avec Alexandre
Faire l'épitaxie.
Faire le fit du FTIR.
ECHOUÉ
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment