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)
def test_iv_depletion_pn(pn_junction): from solcore.analytic_solar_cells import iv_depletion test_junc, options = pn_junction options.light_iv = True V = options.internal_voltages wl = options.wavelength iv_depletion(test_junc[0], options) wl_sp, ph = options.light_source.spectrum(output_units='photon_flux_per_m', x=wl) Jph = q*np.trapz(test_junc.absorbed*ph, wl) approx_Voc = V[np.argmin(abs(test_junc[0].iv(V)))] quadrant = (V > 0) * (V < approx_Voc) power = abs(test_junc[0].iv(V[quadrant])*V[quadrant])[:-1] assert abs(test_junc[0].iv(0)) <= Jph assert approx_Voc < test_junc[0][1].material.band_gap/q assert np.all(power < options.light_source.power_density)