import numpy as np
import os
@@ -190,244 +194,392 @@ Section 10: Perovskite-Si tandem cell with pyramidal surfaces<
import seaborn as sns
from cycler import cycler
WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+Now we set some relevant options. We will scan across 20 x 20 surface points of the pyramid unit cell between 300 and 1200 nm, for unpolarized, normally-incident light. The randomize_surface
option is set to True to prevent correlation between the incident position on the front and rear pyramids. The n_jobs
option is set to -1, which means that all available cores will be used. If you want to use all but one core, change this to -2 etc. We also need to provide a project_name
to save the lookup tables which will be calculated using TMM to use during ray-tracing.
= np.linspace(300, 1200, 40) * 1e-9
- wavelengths
-= LightSource(source_type="standard", version="AM1.5g", x=wavelengths,
- AM15G ="photon_flux_per_m")
- output_units
-= default_options()
- options = wavelengths
- options.wavelength = 20
- options.nx = options.nx
- options.ny = 4 * options.nx**2
- options.n_rays = 1e-9
- options.depth_spacing = "u"
- options.pol = 1e-3
- options.I_thresh = "perovskite_Si_rt"
- options.project_name = True
- options.randomize_surface = -1 # use all cores; to use all but one, change to -2 etc. options.n_jobs
= np.linspace(300, 1200, 40) * 1e-9
+ wavelengths
+= LightSource(source_type="standard", version="AM1.5g", x=wavelengths,
+ AM15G ="photon_flux_per_m")
+ output_units
+= default_options()
+ options = wavelengths
+ options.wavelength = 20
+ options.nx = options.nx
+ options.ny = 4 * options.nx**2
+ options.n_rays = 1e-9
+ options.depth_spacing = "u"
+ options.pol = 1e-3
+ options.I_thresh = "perovskite_Si_rt"
+ options.project_name = True
+ options.randomize_surface = -1 # use all cores; to use all but one, change to -2 etc. options.n_jobs
Adding custom materials
We define our materials. Note that some of these are custom materials added to the database; we only need to do this once. We then define the front layer stack (i.e. all the materials which are on top of the Si, excluding Si itself, which will be the ‘bulk’ material) and the rear layer stack. Layer stacks are always defined starting with the layer closest to the top of the cell.
-# Can comment out this block after running once to add materials to the database
-from solcore.material_system import create_new_material
-
-"Perovskite_CsBr_1p6eV", "data/CsBr10p_1to2_n_shifted.txt",
- create_new_material("data/CsBr10p_1to2_k_shifted.txt")
- "ITO_lowdoping", "data/model_back_ito_n.txt",
- create_new_material("data/model_back_ito_k.txt")
- "aSi_i", "data/model_i_a_silicon_n.txt",
- create_new_material("data/model_i_a_silicon_k.txt")
- "aSi_p", "data/model_p_a_silicon_n.txt",
- create_new_material("data/model_p_a_silicon_k.txt")
- "aSi_n", "data/model_n_a_silicon_n.txt",
- create_new_material("data/model_n_a_silicon_k.txt")
- "C60", "data/C60_Ren_n.txt",
- create_new_material("data/C60_Ren_k.txt")
- "IZO", "data/IZO_Ballif_rO2_10pcnt_n.txt",
- create_new_material("data/IZO_Ballif_rO2_10pcnt_k.txt")
- # Comment out until here
# download_db()
# Can comment out this block after running once to add materials to the database
+from solcore.material_system import create_new_material
+
+"Perovskite_CsBr_1p6eV", "data/CsBr10p_1to2_n_shifted.txt",
+ create_new_material("data/CsBr10p_1to2_k_shifted.txt")
+ "ITO_lowdoping", "data/model_back_ito_n.txt",
+ create_new_material("data/model_back_ito_k.txt")
+ "aSi_i", "data/model_i_a_silicon_n.txt",
+ create_new_material("data/model_i_a_silicon_k.txt")
+ "aSi_p", "data/model_p_a_silicon_n.txt",
+ create_new_material("data/model_p_a_silicon_k.txt")
+ "aSi_n", "data/model_n_a_silicon_n.txt",
+ create_new_material("data/model_n_a_silicon_k.txt")
+ "C60", "data/C60_Ren_n.txt",
+ create_new_material("data/C60_Ren_k.txt")
+ "IZO", "data/IZO_Ballif_rO2_10pcnt_n.txt",
+ create_new_material("data/IZO_Ballif_rO2_10pcnt_k.txt")
+ # Comment out until here
= search_db(os.path.join("MgF2", "Rodriguez-de Marcos"))[0][0];
- MgF2_pageid = search_db(os.path.join("Ag", "Jiang"))[0][0];
- Ag_pageid
-= material("Si")()
- Si = material("Air")()
- Air = material(str(MgF2_pageid), nk_db=True)()
- MgF2 = material("ITO_lowdoping")()
- ITO_back = material("Perovskite_CsBr_1p6eV")()
- Perovskite = material(str(Ag_pageid), nk_db=True)()
- Ag = material("aSi_i")()
- aSi_i = material("aSi_p")()
- aSi_p = material("aSi_n")()
- aSi_n = material("LiF")()
- LiF = material("IZO")()
- IZO = material("C60")()
- C60
-# stack based on doi:10.1038/s41563-018-0115-4
-= [
- front_materials 100e-9, MgF2),
- Layer(110e-9, IZO),
- Layer(15e-9, C60),
- Layer(1e-9, LiF),
- Layer(440e-9, Perovskite),
- Layer(6.5e-9, aSi_n),
- Layer(6.5e-9, aSi_i),
- Layer(
- ]
-= [Layer(6.5e-9, aSi_i), Layer(6.5e-9, aSi_p), Layer(240e-9, ITO_back)] back_materials
# download_db()
Now we define our front and back surfaces, including interface_layers
. We will use regular pyramids for both the front and back surface; these pyramids point out on both sides, but since the direction of the pyramids is defined relative to the front surface, we must set upright=True
for the top surface and upright=False
for the rear surface. We also gives the surfaces a name (used to save the lookup table data) and ask RayFlare to calculate the absorption profile in the 5th layer, which is the perovskite.
= regular_pyramids(
- triangle_surf =55,
- elevation_angle=True,
- upright=1,
- size=front_materials,
- interface_layers="coh_front",
- name=[5],
- prof_layers
- )
-= regular_pyramids(
- triangle_surf_back =55,
- elevation_angle=False,
- upright=1,
- size=back_materials,
- interface_layers="Si_back",
- name=["i"] * len(back_materials),
- coherency_list )
= search_db(os.path.join("MgF2", "Rodriguez-de Marcos"))[0][0];
+ MgF2_pageid = search_db(os.path.join("Ag", "Jiang"))[0][0];
+ Ag_pageid
+= material("Si")()
+ Si = material("Air")()
+ Air = material(str(MgF2_pageid), nk_db=True)()
+ MgF2 = material("ITO_lowdoping")()
+ ITO_back = material("Perovskite_CsBr_1p6eV")()
+ Perovskite = material(str(Ag_pageid), nk_db=True)()
+ Ag = material("aSi_i")()
+ aSi_i = material("aSi_p")()
+ aSi_p = material("aSi_n")()
+ aSi_n = material("LiF")()
+ LiF = material("IZO")()
+ IZO = material("C60")()
+ C60
+# stack based on doi:10.1038/s41563-018-0115-4
+= [
+ front_materials 100e-9, MgF2),
+ Layer(110e-9, IZO),
+ Layer(15e-9, C60),
+ Layer(1e-9, LiF),
+ Layer(440e-9, Perovskite),
+ Layer(6.5e-9, aSi_n),
+ Layer(6.5e-9, aSi_i),
+ Layer(
+ ]
+= [Layer(6.5e-9, aSi_i), Layer(6.5e-9, aSi_p), Layer(240e-9, ITO_back)] back_materials
Database file found at /Users/z3533914/.solcore/nk/nk.db
+1 results found.
+pageid shelf book page filepath hasrefractive hasextinction rangeMin rangeMax points
+234 main MgF2 Rodriguez-de_Marcos main/MgF2/Rodriguez-de Marcos.yml 1 1 0.0299919 2.00146 960
+Database file found at /Users/z3533914/.solcore/nk/nk.db
+1 results found.
+pageid shelf book page filepath hasrefractive hasextinction rangeMin rangeMax points
+2 main Ag Jiang main/Ag/Jiang.yml 1 1 0.3 2.0 1701
Now we make our ray-tracing structure by combining the front and back surfaces, specifying the material in between (Si) and setting its width to 260 microns. In order to use the TMM lookuptables to calculate reflection/transmission/absorption probabilities we must also set use_TMM=True
.
= rt_structure(
- rtstr_coh =[triangle_surf, triangle_surf_back],
- textures=[Si],
- materials=[260e-6],
- widths=Air,
- incidence=Ag,
- transmission=True,
- use_TMM=options,
- options=True,
- overwrite="current",
- save_location
- )
-# calculate:
-= rtstr_coh.calculate(options) result_coh
Now we define the same front surface and structure again, except now we will treat all the layers incoherently (i.e. no thin-film interference) in the TMM.
-Defining the interfaces and structure
+Now we define our front and back surfaces, including interface_layers
. We will use regular pyramids for both the front and back surface; these pyramids point out on both sides, but since the direction of the pyramids is defined relative to the front surface, we must set upright=True
for the top surface and upright=False
for the rear surface. We also gives the surfaces a name (used to save the lookup table data) and ask RayFlare to calculate the absorption profile in the 5th layer, which is the perovskite.
= regular_pyramids(
triangle_surf =55,
elevation_angle=True,
upright=1,
size=front_materials,
- interface_layers=["i"] * len(front_materials),
- coherency_list="inc_front",
- name=[5],
- prof_layers
- )
-= rt_structure(
- rtstr_inc =[triangle_surf, triangle_surf_back],
- textures=[Si],
- materials=[260e-6],
- widths=Air,
- incidence=Ag,
- transmission=True,
- use_TMM=options,
- options=True,
- overwrite="current",
- save_location
- )
-= rtstr_inc.calculate(options) result_inc
Now we make our ray-tracing structure by combining the front and back surfaces, specifying the material in between (Si) and setting its width to 260 microns. In order to use the TMM lookuptables to calculate reflection/transmission/absorption probabilities we must also set use_TMM=True
.
%%capture
+
+= rt_structure(
+ rtstr_coh =[triangle_surf, triangle_surf_back],
+ textures=[Si],
+ materials=[260e-6],
+ widths=Air,
+ incidence=Ag,
+ transmission=True,
+ use_TMM=options,
+ options=True,
+ overwrite="current",
+ save_location
+ )
+# calculate:
+= rtstr_coh.calculate(options) result_coh
INFO: Pre-computing TMM lookup table(s)
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+Database file found at /Users/z3533914/.solcore/nk/nk.db
+Material main/MgF2/Rodriguez-de Marcos.yml loaded.
+Database file found at /Users/z3533914/.solcore/nk/nk.db
+Material main/MgF2/Rodriguez-de Marcos.yml loaded.
+Database file found at /Users/z3533914/.solcore/nk/nk.db
+Material main/Ag/Jiang.yml loaded.
+Database file found at /Users/z3533914/.solcore/nk/nk.db
+Material main/Ag/Jiang.yml loaded.
+WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+WARNING: The RCWA solver will not be available because an S4 installation has not been found.WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+
+WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+WARNING: The RCWA solver will not be available because an S4 installation has not been found.
+Incoherent calculation
+Now we define the same front surface and structure again, except now we will treat all the layers incoherently (i.e. no thin-film interference) in the TMM.
+%%capture
+
+= regular_pyramids(
+ triangle_surf =55,
+ elevation_angle=True,
+ upright=1,
+ size=front_materials,
+ interface_layers=["i"] * len(front_materials),
+ coherency_list="inc_front",
+ name=[5],
+ prof_layers
+ )
+= rt_structure(
+ rtstr_inc =[triangle_surf, triangle_surf_back],
+ textures=[Si],
+ materials=[260e-6],
+ widths=Air,
+ incidence=Ag,
+ transmission=True,
+ use_TMM=options,
+ options=True,
+ overwrite="current",
+ save_location
+ )
+= rtstr_inc.calculate(options) result_inc
INFO: Pre-computing TMM lookup table(s)
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+INFO: Calculating next wavelength...
+Now we plot the results for reflection, transmission, and absorption per layer for both the coherent and incoherent cases.
-= sns.color_palette("husl", n_colors=len(front_materials) + len(back_materials) + 2)
- pal # create a colour palette
-
-= cycler("color", pal)
- cols # set this as the default colour palette in matplotlib
-
-= {
- params "axes.prop_cycle": cols,
-
- }
-
- plt.rcParams.update(params)
-= plt.figure(figsize=(8, 3.7))
- fig 1, 1, 1)
- plt.subplot(* 1e9, result_coh["R"], "-ko", label="R")
- plt.plot(wavelengths * 1e9, result_coh["T"], mfc="none", label="T")
- plt.plot(wavelengths * 1e9, result_coh["A_per_layer"][:, 0], "-o", label='Si')
- plt.plot(wavelengths * 1e9, result_coh["A_per_interface"][0], "-o",
- plt.plot(wavelengths =[None, "IZO", "C60", None, "Perovskite", None, None])
- label* 1e9, result_coh["A_per_interface"][1], "-o",
- plt.plot(wavelengths =[None, None, "ITO"])
- label
-* 1e9, result_inc["R"], "--ko", mfc="none")
- plt.plot(wavelengths * 1e9, result_inc["T"], mfc="none")
- plt.plot(wavelengths * 1e9, result_inc["A_per_layer"][:, 0], "--o", mfc="none")
- plt.plot(wavelengths * 1e9, result_inc["A_per_interface"][0], "--o", mfc="none")
- plt.plot(wavelengths * 1e9, result_inc["A_per_interface"][1], "--o", mfc="none")
- plt.plot(wavelengths
-300, 301], [0, 0], "-k", label="coherent")
- plt.plot([300, 301], [0, 0], "--k", label="incoherent")
- plt.plot(["Wavelength (nm)")
- plt.xlabel("R / A / T")
- plt.ylabel(0, 1)
- plt.ylim(300, 1200)
- plt.xlim(=(1.05, 1))
- plt.legend(bbox_to_anchor
- plt.tight_layout() plt.show()
= sns.color_palette("husl", n_colors=len(front_materials) + len(back_materials) + 2)
+ pal # create a colour palette
+
+= cycler("color", pal)
+ cols # set this as the default colour palette in matplotlib
+
+= {
+ params "axes.prop_cycle": cols,
+
+ }
+
+ plt.rcParams.update(params)
+= plt.figure(figsize=(8, 3.7))
+ fig 1, 1, 1)
+ plt.subplot(* 1e9, result_coh["R"], "-ko", label="R")
+ plt.plot(wavelengths * 1e9, result_coh["T"], mfc="none", label="T")
+ plt.plot(wavelengths * 1e9, result_coh["A_per_layer"][:, 0], "-o", label='Si')
+ plt.plot(wavelengths * 1e9, result_coh["A_per_interface"][0], "-o",
+ plt.plot(wavelengths =[None, "IZO", "C60", None, "Perovskite", None, None])
+ label* 1e9, result_coh["A_per_interface"][1], "-o",
+ plt.plot(wavelengths =[None, None, "ITO"])
+ label
+* 1e9, result_inc["R"], "--ko", mfc="none")
+ plt.plot(wavelengths * 1e9, result_inc["T"], mfc="none")
+ plt.plot(wavelengths * 1e9, result_inc["A_per_layer"][:, 0], "--o", mfc="none")
+ plt.plot(wavelengths * 1e9, result_inc["A_per_interface"][0], "--o", mfc="none")
+ plt.plot(wavelengths * 1e9, result_inc["A_per_interface"][1], "--o", mfc="none")
+ plt.plot(wavelengths
+300, 301], [0, 0], "-k", label="coherent")
+ plt.plot([300, 301], [0, 0], "--k", label="incoherent")
+ plt.plot(["Wavelength (nm)")
+ plt.xlabel("R / A / T")
+ plt.ylabel(0, 1)
+ plt.ylim(300, 1200)
+ plt.xlim(=(1.05, 1))
+ plt.legend(bbox_to_anchor
+ plt.tight_layout() plt.show()
Calculate and print the limiting short-circuit current per junction:
-= q*np.trapz(result_coh["A_per_interface"][0][:,4]*AM15G.spectrum()[1],
- Jmax_Pero_coh =wavelengths)/10
- x= q*np.trapz(result_coh["A_per_layer"][:, 0]*AM15G.spectrum()[1],
- Jmax_Si_coh =wavelengths)/10
- x
-print("Limiting short-circuit currents in coherent calculation (mA/cm2): {:.2f} / {:"
-".2f}".format(Jmax_Pero_coh, Jmax_Si_coh))
-
-= q*np.trapz(result_inc["A_per_interface"][0][:,4]*AM15G.spectrum()[1],
- Jmax_Pero_inc =wavelengths)/10
- x= q*np.trapz(result_inc["A_per_layer"][:, 0]*AM15G.spectrum()[1],
- Jmax_Si_inc =wavelengths)/10
- x
-print("Limiting short-circuit currents in coherent calculation (mA/cm2): {:.2f} / {:"
-".2f}".format(Jmax_Pero_inc, Jmax_Si_inc))
= q*np.trapz(result_coh["A_per_interface"][0][:,4]*AM15G.spectrum()[1],
+ Jmax_Pero_coh =wavelengths)/10
+ x= q*np.trapz(result_coh["A_per_layer"][:, 0]*AM15G.spectrum()[1],
+ Jmax_Si_coh =wavelengths)/10
+ x
+print("Limiting short-circuit currents in coherent calculation (mA/cm2): {:.2f} / {:"
+".2f}".format(Jmax_Pero_coh, Jmax_Si_coh))
+
+= q*np.trapz(result_inc["A_per_interface"][0][:,4]*AM15G.spectrum()[1],
+ Jmax_Pero_inc =wavelengths)/10
+ x= q*np.trapz(result_inc["A_per_layer"][:, 0]*AM15G.spectrum()[1],
+ Jmax_Si_inc =wavelengths)/10
+ x
+print("Limiting short-circuit currents in coherent calculation (mA/cm2): {:.2f} / {:"
+".2f}".format(Jmax_Pero_inc, Jmax_Si_inc))
Limiting short-circuit currents in coherent calculation (mA/cm2): 19.27 / 21.47
+Limiting short-circuit currents in coherent calculation (mA/cm2): 18.67 / 20.98
Absorption profiles
We can also plot the absorption profiles, for wavelengths up to 800 nm, in the perovskite (since we asked the solver to calculate the profile in the perovskite layer above).
-= wavelengths < 800e-9
- wl_Eg
-= sns.cubehelix_palette(sum(wl_Eg), reverse=True)
- pal = cycler("color", pal)
- cols = {
- params "axes.prop_cycle": cols,
-
- }
- plt.rcParams.update(params)
-= np.arange(0, rtstr_coh.interface_layer_widths[0][4], options.depth_spacing*1e9)
- pos
-= plt.subplots(1,2)
- fig, (ax1, ax2) "interface_profiles"][0][wl_Eg].T)
- ax1.plot(pos, result_coh[0, 0.02)
- ax1.set_ylim("z (nm)")
- ax1.set_xlabel("a(z)")
- ax1.set_ylabel("Coherent")
- ax1.set_title("interface_profiles"][0][wl_Eg].T)
- ax2.plot(pos, result_inc[0, 0.02)
- ax2.set_ylim(
- ax2.yaxis.set_ticklabels([])"z (nm)")
- ax2.set_xlabel("Incoherent")
- ax2.set_title( plt.show()
= wavelengths < 800e-9
+ wl_Eg
+= sns.cubehelix_palette(sum(wl_Eg), reverse=True)
+ pal = cycler("color", pal)
+ cols = {
+ params "axes.prop_cycle": cols,
+
+ }
+ plt.rcParams.update(params)
+= np.arange(0, rtstr_coh.interface_layer_widths[0][4], options.depth_spacing*1e9)
+ pos
+= plt.subplots(1,2)
+ fig, (ax1, ax2) "interface_profiles"][0][wl_Eg].T)
+ ax1.plot(pos, result_coh[0, 0.02)
+ ax1.set_ylim("z (nm)")
+ ax1.set_xlabel("a(z)")
+ ax1.set_ylabel("Coherent")
+ ax1.set_title("interface_profiles"][0][wl_Eg].T)
+ ax2.plot(pos, result_inc[0, 0.02)
+ ax2.set_ylim(
+ ax2.yaxis.set_ticklabels([])"z (nm)")
+ ax2.set_xlabel("Incoherent")
+ ax2.set_title( plt.show()
We see that, as expected, the coherent case shows interference fringes while the incoherent case does not. We can also plot the absorption profile in the Si (> 800 nm):
-= pos = np.arange(0, rtstr_coh.widths[0]*1e6, options.depth_spacing_bulk*1e6)
- pos_bulk
-= plt.subplots(1,2)
- fig, (ax1, ax2) "profile"][~wl_Eg].T)
- ax1.semilogy(pos, result_coh[1e-8, 0.00015)
- ax1.set_ylim("z (um)")
- ax1.set_xlabel("a(z)")
- ax1.set_ylabel("Coherent")
- ax1.set_title("profile"][~wl_Eg].T)
- ax2.semilogy(pos, result_inc[1e-8, 0.00015)
- ax2.set_ylim(
- ax2.yaxis.set_ticklabels([])"z (um)")
- ax2.set_xlabel("Incoherent")
- ax2.set_title( plt.show()
= pos = np.arange(0, rtstr_coh.widths[0]*1e6, options.depth_spacing_bulk*1e6)
+ pos_bulk
+= plt.subplots(1,2)
+ fig, (ax1, ax2) "profile"][~wl_Eg].T)
+ ax1.semilogy(pos, result_coh[1e-8, 0.00015)
+ ax1.set_ylim("z (um)")
+ ax1.set_xlabel("a(z)")
+ ax1.set_ylabel("Coherent")
+ ax1.set_title("profile"][~wl_Eg].T)
+ ax2.semilogy(pos, result_inc[1e-8, 0.00015)
+ ax2.set_ylim(
+ ax2.yaxis.set_ticklabels([])"z (um)")
+ ax2.set_xlabel("Incoherent")
+ ax2.set_title( plt.show()
Questions
-
diff --git a/docs/solcore-workshop-2/notebooks/10-perovskite_Si_rt_files/figure-html/cell-10-output-1.png b/docs/solcore-workshop-2/notebooks/10-perovskite_Si_rt_files/figure-html/cell-10-output-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..0071e9a65eb76bd0b883732e0879f2d5f260ff29
GIT binary patch
literal 75221
zcmYhj1yq$mw?7P`q%=r}(v3*BfOLm+cXy|R2-4k1cXu~PcQ;6PH~fe9z4w0KT89Pa
zaCpwlJbU)uzZimKr9}|oap55#AP~hwh2$Y1pwJ*7AdO+6!7EJF-Vxv%hr>4&2L)>*
z2WMS7LkKBd2OA4(2Mbd@Vkbj8dsAzxFZAs6pJ|Cr92{)yIT;u%|L+a-)^^4W6UFG<
z;39A~qN?@~5Xic(Uy%8Hd8QDM5D;QQUlm
{70Ri2*nI^Pq8UvGs@iybL%cJxLpajY3
z>5)>U`+Ojw<|_0>LO0`SRR#LO2*wYty1Tm>-LEagC3=L*1|3_o6Zl5bq1OCRH(ibA
zuwMb`$$Pvm=S_<5^X-y(^17AtW0WZfhVl}@97*wlLDK^rDYV;`PpQLu1>6fQb@i&2
z{AK}Bt}XW$4y!**FyLA9^3ETRON6kSsg=gnJhw5T7oGUud{5);zi6t}vuEdiBCDoG
zQusJy4+BxY!{NPCeFnUJNkl-BkHP>Jub+3_z2aqD!A$+yXQa9MZ7g0kzQoMb;Ul6R
zpkE$J{1ONpckz%=(B%gGXu#UncedFFhlp6h{9HB4yIGKzrZ-<{_@0nE0i8mcQNQ;+
zshA$%=?HJ(liEPm+~hanH+g&X^jJhdG04R9CxWzEoUH79Gj35=M?t5@c*a7PmC0n7
z3z7HngC~KL>b8v)>yAY59wD|Q;BEkgGXfgADwa*|QEirl9gvm*k(Xe>s &syNs
zF4kzM950=fclE&fSFBpaZomEBs4DSjvF?jbJH)Ix9-Gy_E@VCjp6>;U+z*FUz-NjU
z-7h3A4sYG|#0m_)p+qiUYBr|eEGqp7zkYOpdv9ksp;_%sF`o&2gO&*s5>Zt%
ziQ=-{#{`LDsVbCRXKbd+e)xZnpAIe9yzyct5{J=_o;|tji>=JcCIRYGO$Ws?r--uk
zZ_RoouZYD~lO1l&O?~z$jk(d^H;F~{G;2{;mK})S0V;E~L=OYMr_9;VQp{Q5S~AY(
z`lrJzo#2~Mpel|Q3*j!N)W5LHHtc(b63cM;8sR@FM3zKV@fbQrB+LMZ_Gds|v56zl
zf5hJBI5FFFxpqD=pM9s};~m&5q)KkR9PZbs;S6~wQd~zzNAsD7-xfvSh_%Q?HH1Be
z{A?D!1Af+@rn$SvGtp(fWMQ7sy8+Aw1E-%O4m2yP%&EhA5HnIFj3&iwWp_u1_m
zEyES$Z`+a+P>F#Q<&_In`jf2q$Wzo}Yf6C*6cU{ve+re#GHMOPoB}^y7==)s@=Eh>
z#s}MIe6Jp?dBk#Hj(
C?{Mo-tJ9Hd8f2hkxHu`UW>QivVTv35?_Lla-Z~r-bc*7;xE|B8Dy)
z7&}D>N!S?@*yCA05f1Zyv^n^IrXc8I
z)~N~uH$y?U3C!GqiI*#