def test_process_junction_pn(): from solcore.analytic_solar_cells.depletion_approximation import identify_layers, identify_parameters from solcore import material from solcore.structure import Layer, Junction from solcore.state import State Na = np.power(10, np.random.uniform(22, 25)) Nd = np.power(10, np.random.uniform(23, 26)) options = State() options.T = np.random.uniform(250, 350) Lp = np.power(10, np.random.uniform(-9, -6)) # Diffusion length Ln = np.power(10, np.random.uniform(-9, -6)) # Diffusion length GaAs_n = material("GaAs")(Nd=Nd, hole_diffusion_length=Ln) GaAs_p = material("GaAs")(Na=Na, electron_diffusion_length=Lp) p_width = np.random.uniform(500, 1000)*1e-9 n_width = np.random.uniform(3000, 5000)*1e-9 test_junc = Junction([Layer(p_width, GaAs_p, role="emitter"), Layer(n_width, GaAs_n, role="base")]) id_top, id_bottom, pRegion, nRegion, iRegion, pn_or_np = identify_layers(test_junc) xn, xp, xi, sn, sp, ln, lp, dn, dp, Nd_c, Na_c, ni, es = identify_parameters(test_junc, options.T, pRegion, nRegion, iRegion) ni_expect = GaAs_n.ni assert [id_top, id_bottom] == approx([0, 1]) assert pn_or_np == 'pn' assert [xn, xp, xi, sn, sp, ln, lp, dn, dp, Nd_c, Na_c, ni, es] == approx([n_width, p_width, 0, 0, 0, Lp, Ln, GaAs_n.hole_mobility * kb * options.T / q, GaAs_p.electron_mobility * kb * options.T / q, Nd, Na, ni_expect, GaAs_n.permittivity])
def test_process_junction_set_in_junction(): from solcore.analytic_solar_cells.depletion_approximation import identify_layers, identify_parameters from solcore import material from solcore.structure import Layer, Junction from solcore.state import State options = State() options.T = np.random.uniform(250, 350) Lp = np.power(10, np.random.uniform(-9, -6)) # Diffusion length Ln = np.power(10, np.random.uniform(-9, -6)) # Diffusion length sn = np.power(10, np.random.uniform(0, 3)) sp = np.power(10, np.random.uniform(0, 3)) se = np.random.uniform(1, 20) * vacuum_permittivity GaAs_n = material("GaAs")() GaAs_p = material("GaAs")() GaAs_i = material("GaAs")() p_width = np.random.uniform(500, 1000) n_width = np.random.uniform(3000, 5000) i_width = np.random.uniform(100, 300) * 1e-9 mun = np.power(10, np.random.uniform(-5, 0)) mup = np.power(10, np.random.uniform(-5, 0)) Vbi = np.random.uniform(0, 3) test_junc = Junction([ Layer(p_width, GaAs_p, role="emitter"), Layer(i_width, GaAs_i, role="intrinsic"), Layer(n_width, GaAs_n, role="base") ], sn=sn, sp=sp, permittivity=se, ln=Ln, lp=Lp, mup=mup, mun=mun, Vbi=Vbi) id_top, id_bottom, pRegion, nRegion, iRegion, pn_or_np = identify_layers( test_junc) xn, xp, xi, sn_c, sp_c, ln, lp, dn, dp, Nd_c, Na_c, ni, es = identify_parameters( test_junc, options.T, pRegion, nRegion, iRegion) ni_expect = GaAs_n.ni assert [id_top, id_bottom] == approx([0, 2]) assert pn_or_np == 'pn' assert [xn, xp, xi, sn_c, sp_c, ln, lp, dn, dp, Nd_c, Na_c, ni, es] == approx([ n_width, p_width, i_width, sn, sp, Ln, Lp, mun * kb * options.T / q, mup * kb * options.T / q, 1, 1, ni_expect, se ])
def test_dark_iv_depletion_np(np_junction): from solcore.analytic_solar_cells.depletion_approximation import iv_depletion, get_depletion_widths, get_j_dark, get_Jsrh, identify_layers, identify_parameters from scipy.interpolate import interp1d test_junc, options = np_junction options.light_iv = False T = options.T test_junc[0].voltage = options.internal_voltages id_top, id_bottom, pRegion, nRegion, iRegion, pn_or_np = identify_layers(test_junc[0]) xn, xp, xi, sn, sp, ln, lp, dn, dp, Nd, Na, ni, es = identify_parameters(test_junc[0], T, pRegion, nRegion, iRegion) niSquared = ni**2 kbT = kb * T Vbi = (kbT / q) * np.log(Nd * Na / niSquared) V = np.where(test_junc[0].voltage < Vbi - 0.001, test_junc[0].voltage, Vbi - 0.001) wn, wp = get_depletion_widths(test_junc[0], es, Vbi, V, Na, Nd, xi) w = wn + wp + xi l_bottom, l_top = ln, lp x_bottom, x_top = xp, xn w_bottom, w_top = wp, wn s_bottom, s_top = sp, sn d_bottom, d_top = dp, dn min_bot, min_top = niSquared / Na, niSquared / Nd JtopDark = get_j_dark(x_top, w_top, l_top, s_top, d_top, V, min_top, T) JbotDark = get_j_dark(x_bottom, w_bottom, l_bottom, s_bottom, d_bottom, V, min_bot, T) JpDark, JnDark = JbotDark, JtopDark lifetime_n = ln ** 2 / dn lifetime_p = lp ** 2 / dp # Jenny p163 Jrec = get_Jsrh(ni, V, Vbi, lifetime_p, lifetime_n, w, kbT) J_sc_top = 0 J_sc_bot = 0 J_sc_scr = 0 current = Jrec + JnDark + JpDark + V / 1e14- J_sc_top - J_sc_bot - J_sc_scr iv = interp1d(test_junc[0].voltage, current, kind='linear', bounds_error=False, assume_sorted=True, fill_value=(current[0], current[-1]), copy=True) iv_depletion(test_junc[0], options) assert test_junc[0].iv(options.internal_voltages) == approx(iv(options.internal_voltages), nan_ok=True)