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

Merge remote-tracking branch 'origin/master'

parents 344281eb 9c101694
......@@ -43,11 +43,11 @@ def al_doping(bypass_dbr=True):
def reflectivity(bypass_dbr=False,
start_wavelength=849e-9,
stop_wavelength=852e-9,
start_wavelength=800e-9,
stop_wavelength=900e-9,
electric_field=0.,
n_points=100,
l_eam_clad=15e-9,
l_eam_clad=8e-9,
l_vcsel_clad=15e-9,
plot=True):
wavelength = np.linspace(start_wavelength, stop_wavelength, num=n_points)
......@@ -56,7 +56,7 @@ def reflectivity(bypass_dbr=False,
# wavelength in [m]
# wavelength must be a numpy array
for i in tqdm(range(len(wavelength))):
sl = st.structure_eam_vcsel(bypass_dbr=bypass_dbr, vcsel_only=True, eam_only=False, grading_type='linear digital', mqw_alloy_type='digital',
sl = st.structure_eam_vcsel(bypass_dbr=bypass_dbr, vcsel_only=False, eam_only=True, eam_alox=True, grading_type='linear digital', mqw_alloy_type='digital',
l_eam_clad=l_eam_clad, l_vcsel_clad=l_vcsel_clad)
sl = op.algaas_super_lattice_refractive_index(sl, electric_field, wavelength[i], lengyel=True)
......@@ -98,6 +98,7 @@ def dbr_reflectivity(start_wavelength=700e-9,
def reflectivity_heatmap(bypass_dbr=True,
eam_only=False,
start_wavelength=700e-9,
stop_wavelength=1000e-9,
electric_field=0.,
......@@ -109,6 +110,7 @@ def reflectivity_heatmap(bypass_dbr=True,
v_al12=150,
r_file_name='heatmap_r'):
time, wavelength, r = epx.reflectivity_heatmap(bypass_dbr=bypass_dbr,
eam_only=eam_only,
start_wavelength=start_wavelength,
stop_wavelength=stop_wavelength,
electric_field=electric_field,
......
This diff is collapsed.
This diff is collapsed.
......@@ -7,6 +7,7 @@ from tqdm import tqdm
import optic as op
import pandas_tools as pdt
import super_lattice_structure as sls
import transfer_matrix_method as tmm
......@@ -236,6 +237,7 @@ def reflectivity_from_growth_speed_1x1(bypass_dbr=True, delta_speed=0.1, start_w
def reflectivity_heatmap(bypass_dbr=True,
eam_only=False,
start_wavelength=700e-9,
stop_wavelength=1000e-9,
electric_field=0.,
......@@ -245,15 +247,20 @@ 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)
# create the super lattice
sl = sls.structure_eam(bypass_dbr=bypass_dbr,
v_ga6=v_ga6,
v_ga11=v_ga11,
v_al5=v_al5,
v_al12=v_al12)
sl = sls.structure_eam_vcsel(bypass_dbr=bypass_dbr,
eam_only=eam_only,
v_ga6=v_ga6,
v_ga11=v_ga11,
v_al5=v_al5,
v_al12=v_al12)
# add the depth column
sl = pdt.add_depth_column(sl)
......@@ -278,15 +285,17 @@ 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)):
sl_j = op.algaas_super_lattice_refractive_index(sl_i, electric_field, wavelength[j], lengyel=False)
n, d = op.algaas_super_lattice_refractive_index_opti(sl_arrays_i, wavelength[j], refra_data_550, temperature=550+273.15)
r[j, i] = tmm.reflection(n, d, wavelength[j])
n = sl_j['refractive_index'].to_numpy(dtype=np.complex128)
d = sl_j['thickness'].to_numpy(dtype=np.complex128)
r[j, i] = op.reflection(n, d, wavelength[j])
return time, wavelength, r
......
import numpy as np
# physical constants
C = 299792458.0 # speed of light [m/s]
Q = 1.602176634e-19 # Electron Charge [C] 1C = 1A*1s
......@@ -38,3 +43,6 @@ MZHH_GAAS = 0.48*M0 # heavy hole effective mass p.298 GaAs
ME_QW = ME_GAAS # e- effective mass in well
MZHH_QW = MZHH_GAAS # heavy hole effective mass in well
......@@ -7,18 +7,31 @@ import optic as op
import plot as plt
import scipy.io
import super_lattice_structure as st
import transfer_matrix_method as tmm
def eams_heatmaps():
def eam_vcsels_heatmaps():
cl.reflectivity_heatmap(bypass_dbr=False,
n_wavelength=1080,
n_time=1920,
r_file_name='heatmap_r_eam_1')
r_file_name='heatmap_r_eam_vcsel_1')
cl.reflectivity_heatmap(bypass_dbr=True,
n_wavelength=1080,
n_time=1920,
r_file_name='heatmap_r_eam_vcsel_2')
def eam_heatmaps():
cl.reflectivity_heatmap(bypass_dbr=False,
eam_only=True,
n_wavelength=900,
n_time=1600,
r_file_name='heatmap_r_eam_1')
cl.reflectivity_heatmap(bypass_dbr=True,
eam_only=True,
n_wavelength=900,
n_time=1600,
r_file_name='heatmap_r_eam_2')
......@@ -41,7 +54,7 @@ def reflectivity_eam_vcsel_clad_heatmap():
n = sl['refractive_index'].to_numpy(dtype=np.complex128)
d = sl['thickness'].to_numpy(dtype=float)
r[j, i] = op.reflection(n, d, 850e-9)
r[j, i] = tmm.reflection(n, d, 850e-9)
plt.plot_std_heatmap(l_eam_clad, l_vcsel_clad, r)
......
......@@ -3,15 +3,55 @@ import numpy as np
from globals import C, HEV, N0, 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):
if only_real:
lengyel = False
if temperature == 550+273.15 :
refractive_index_function = almuneau_complex_550C_algaas_refractive_index
else :
refractive_index_function = afromovitz_varshni_real_algaas_refractive_index
for i in range(len(super_lattice)):
name = super_lattice.at[i, 'name']
al = super_lattice.at[i, 'al']
......@@ -32,7 +72,7 @@ def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelen
# if refractive index has never been calculated
if calculated_qw_layers.empty:
# refractive index value
n = afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=temperature)
n = refractive_index_function(al, wavelength, temperature=temperature)
# confinement barrier aluminium content
al = confinement_barrier_mean_al_content(super_lattice, i) # [1]
......@@ -64,7 +104,7 @@ def algaas_super_lattice_refractive_index(super_lattice, electric_field, wavelen
# layer is NOT a quantum well
else:
# refractive index value
n = afromovitz_varshni_real_algaas_refractive_index(al, wavelength, temperature=temperature)
n = refractive_index_function(al, wavelength, temperature=temperature)
if only_real:
super_lattice.at[i, 'refractive_index'] = np.real(n)
......@@ -171,6 +211,10 @@ def afromovitz_simplified_real_algaas_refractive_index(al, wavelength):
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')
t_c = temperature -273.15
e = HEV*C/wavelength
......@@ -206,6 +250,18 @@ 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):
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'])
return n + 1j * k
def ioffe_algaas_permittivity(al, high_frequency=True):
if high_frequency:
mu = 10.89 - 2.73 * al
......@@ -234,3 +290,57 @@ 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
......@@ -246,6 +246,16 @@ def add_epitaxial_time_columns(super_lattice,
def extract_arrays_from_super_lattice(super_lattice):
name_array = super_lattice['name'].to_numpy()
al_array = super_lattice['al'].to_numpy(dtype=float)
thickness_array = super_lattice['thickness'].to_numpy(dtype=float)
r_array = super_lattice['refractive_index'].to_numpy(dtype=np.complex128)
return [name_array, al_array, thickness_array, r_array]
def fexp(number):
(sign, digits, exponent) = Decimal(number).as_tuple()
return len(digits) + exponent - 1
......
OBJECTIFS
Faire la structure en python. (reste les claddings du vcsel)
Calculer pour plusieurs épaisseurs de cladding ( cladding du vcsel? dj7?) l'amplitude du champ électromagnétique et comparer avec la publication de Krassimir.
Présenter à Ghuillem et Christophe le résultat.
Nettoyer le code de la structure python.
Traiter les courbes mesurées de la refléctivité temporelle.
Les comparer aux calculs théoriques.
Planifier les épitaxies des deux vcsels eam, et du substrat nid pour les tlms.
Faire l'épitaxie.
Faire la présentation pour la réunion.
Faire le fit du FTIR.
Refaire le FTIR.
Vérifier quelles cellules sont ouvertes lors de l'éptiaxie d'un puit, et corriger le code en conséquence.
Vérifier les recettes avec Alexandre
ACCOMPLI
Alliages digitaux dynamiques.
Calculer la réflectivité temporelle des deux structures totales.
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.
ECHOUÉ
FTIR.
Calcul carte de chaleur reflectivité
QUESTIONS
Je comprends pas la MTF.
PRESENTATION
Rappel des faits.
Matrices de diffusions.
Reflectivités temporelles.
FTIR EAM.
AFM EAM.
Caractérisations de l'AC450CT.
Méthode accordage vcsel eam.
Comparaison FTIR calculs en fonction vitesses croissances.
import super_lattice_structure as sls
def eam_alox():
return sls.structure_eam_vcsel()
\ No newline at end of file
......@@ -15,12 +15,13 @@ def structure_eam_vcsel(vcsel_only = False,
air = True,
top_contact = True,
top_eam_dbr = True,
eam_alox = False,
eam_mqw = True,
bypass_dbr = True,
bot_eam_dbr = True,
middle_contact = True,
shared_dbr = True,
alox = True,
vcsel_alox = True,
vcsel_mqw = True,
bot_vcsel_dbr = True,
substrate = True,
......@@ -29,7 +30,7 @@ def structure_eam_vcsel(vcsel_only = False,
eam_mean_al = 0.22,
l_eam_qw = 8.27e-9,
l_eam_cb = 10.3e-9,
l_eam_clad = 15e-9,
l_eam_clad = 8e-9,
amount_vcsel_qw = 3,
vcsel_mean_al = 0.22,
......@@ -61,12 +62,13 @@ def structure_eam_vcsel(vcsel_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
alox = True
vcsel_alox = True
vcsel_mqw = True
bot_vcsel_dbr = True
substrate = True
......@@ -74,11 +76,12 @@ def structure_eam_vcsel(vcsel_only = False,
air = True
top_contact = True
top_eam_dbr = True
eam_alox = False
eam_mqw = True
bot_eam_dbr = True
middle_contact = True
shared_dbr = True
alox = False
vcsel_alox = False
vcsel_mqw = False
bot_vcsel_dbr = False
substrate = True
......@@ -86,11 +89,12 @@ def structure_eam_vcsel(vcsel_only = False,
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
alox = False
vcsel_alox = False
vcsel_mqw = False
bot_vcsel_dbr = False
substrate = False
......@@ -129,6 +133,12 @@ def structure_eam_vcsel(vcsel_only = False,
sl = sl.append(dbr, ignore_index=True)
# aluminium oxide aperture
if eam_alox:
alox_layers = structure_alox()
sl = sl.append(alox_layers, ignore_index=True)
# eam mqw
if eam_mqw:
mqw = structure_mqw(name = 'eam',
......@@ -208,7 +218,7 @@ def structure_eam_vcsel(vcsel_only = False,
# aluminium oxide aperture
if alox:
if vcsel_alox:
alox_layers = structure_alox()
sl = sl.append(alox_layers, ignore_index=True)
......@@ -392,6 +402,8 @@ def structure_dbr(period = 6,
linear_grading_low_to_high_al = structure_linear_grading(grading_type = grading_type,
grading_width = grading_width,
period = grading_period,
low_al = low_al,
high_al = high_al,
na = na,
nd = nd,
v_ga11 = v_ga11,
......
......@@ -141,19 +141,19 @@ def scattering_matrix_global():
def scattering_matrix_layer(vi, vg, xi):
a = np.identity(2) + np.matmul(np.linalg.inv(vi), vg)
b = np.identity(2) - np.matmul(np.linalg.inv(vi), vg)
a = np.identity(2) +np.linalg.inv(vi) @ vg
b = np.identity(2) -np.linalg.inv(vi) @ vg
xb = np.matmul(xi, b)
bab = np.matmul(np.matmul(b, np.linalg.inv(a)), b)
xbax = np.matmul(np.matmul(xb, np.linalg.inv(a)), xi)
xb = xi @ b
bab = b @ np.linalg.inv(a) @ b
xbax = xb @ np.linalg.inv(a) @ xi
d = a - np.matmul(xbax, b)
e = np.matmul(xbax, a) - b
f = np.matmul(xi, a - bab)
d = a -xbax @ b
e = xbax @ a - b
f = xi @ (a - bab)
s_11_22 = np.matmul(np.linalg.inv(d), e)
s_12_21 = np.matmul(np.linalg.inv(d), f)
s_11_22 = np.linalg.inv(d) @ e
s_12_21 = np.linalg.inv(d) @ f
s = np.array([[s_11_22, s_12_21],
[s_12_21, s_11_22]])
......@@ -162,19 +162,19 @@ def scattering_matrix_layer(vi, vg, xi):
return s
def redheffer_star_product(sg, si):
ig = np.matmul(si[0, 0], sg[1, 1])
gi = np.matmul(sg[1, 1], si[0, 0])
def redheffer_star_product(sa, sb):
ba = sb[0, 0] @ sa[1, 1]
ab = sa[1, 1] @ sb[0, 0]
d = np.matmul(sg[0, 1], np.linalg.inv(np.identity(2) -ig))
f = np.matmul(si[1, 0], np.linalg.inv(np.identity(2) -gi))
d = sa[0, 1] @ np.linalg.inv(np.identity(2) -ba)
f = sb[1, 0] @ np.linalg.inv(np.identity(2) -ab)
s = np.array([[
sg[0, 0] +np.matmul(np.matmul(d, si[0, 0]), sg[1, 0]),
np.matmul(d, si[0, 1])
sa[0, 0] +d @ sb[0, 0] @ sa[1, 0],
d @ sb[0, 1]
], [
np.matmul(f, sg[1, 0]),
si[1, 1] +np.matmul(np.matmul(f, sg[1, 1]), si[0, 1])
f @ sa[1, 0],
sb[1, 1] +f @ sa[1, 1] @ sb[0, 1]
]])
......@@ -199,7 +199,7 @@ def em_amplitude_scattering_matrix(super_lattice, wavelength, normalize=True):
q_global = np.array([[0., 1.],
[-1., 0.]])
eigen_g = 1j * np.identity(2)
v_global = np.matmul(q_global, np.linalg.inv(eigen_g))
v_global = eigen_g @ q_global
# initialize global scattering matrix
s_global_ini = scattering_matrix_global()
......@@ -222,8 +222,8 @@ def em_amplitude_scattering_matrix(super_lattice, wavelength, normalize=True):
k_z_i = k_0 * k_zt_i
eigen_i[i] = 1j * k_zt_i * np.identity(2)
q_i = np.array([[0., k_zt_i**2],
[-k_zt_i**2, 0.]])
q_i = np.array([[0., k_zt_i**2],
[-k_zt_i**2, 0.]])
v_i[i] = np.matmul(q_i, np.linalg.inv(eigen_i[i]))
x_i = expm(1j * k_z_i * l * np.identity(2))
......
......@@ -9,8 +9,8 @@ import optic as op
def eam_structures_description(document_folder=True):
# create the structures
eam = st.structure_eam()
eam_dbr_bypass = st.structure_eam(bypass_dbr=True)
eam = st.structure_eam_vcsel()
eam_dbr_bypass = st.structure_eam_vcsel(bypass_dbr=True)
# structures list
eams = [eam, eam_dbr_bypass]
......@@ -25,50 +25,15 @@ def eam_structures_description(document_folder=True):
else:
writer = pd.ExcelWriter('eam_structures_layers.xlsx', engine='xlsxwriter')
# get the xlsxwriter workbook objects
#workbook = writer.book
# sheets list
sheets = ['eam 1', 'eam 2 bypass dbr']
# colors formatting
#highlight_yellow = workbook.add_format({'bg_color': '#FFFF99'})
#highlight_light_blue = workbook.add_format({'bg_color': '#99FFFF'})
#highlight_blue = workbook.add_format({'bg_color': '#99CCFF'})
#highlight_violet = workbook.add_format({'bg_color': '#9999FF'})
#highlight_red = workbook.add_format({'bg_color': '#FF99CC'})
#highlight_green = workbook.add_format({'bg_color': '#99FF99'})
#highlight_white = workbook.add_format({'bg_color': '#FFFFFF'})
for i in range(len(eams)):
# write the sheets
eams[i].to_excel(writer, sheet_name=sheets[i])
# color highlighting of lines
# get the xlsxwriter worksheet objects
#worksheet = writer.sheets[sheets[i]]
#for col in range(eams[i].shape[1]):
# for row in range(eams[i].shape[0]):
# name = eams[i].at[i, 'name']
#
# # blank case