def test_pvsyst_recombination_loss(method, poa, temp_cell, expected, tol): """test PVSst recombination loss""" pvsyst_fs_495 = get_pvsyst_fs_495() # first evaluate PVSyst model with thin-film recombination loss current # at reference conditions x = pvsystem.calcparams_pvsyst( effective_irradiance=poa, temp_cell=temp_cell, alpha_sc=pvsyst_fs_495['alpha_sc'], gamma_ref=pvsyst_fs_495['gamma_ref'], mu_gamma=pvsyst_fs_495['mu_gamma'], I_L_ref=pvsyst_fs_495['I_L_ref'], I_o_ref=pvsyst_fs_495['I_o_ref'], R_sh_ref=pvsyst_fs_495['R_sh_ref'], R_sh_0=pvsyst_fs_495['R_sh_0'], R_sh_exp=pvsyst_fs_495['R_sh_exp'], R_s=pvsyst_fs_495['R_s'], cells_in_series=pvsyst_fs_495['cells_in_series'], EgRef=pvsyst_fs_495['EgRef'] ) il_pvsyst, io_pvsyst, rs_pvsyst, rsh_pvsyst, nnsvt_pvsyst = x voc_est_pvsyst = estimate_voc(photocurrent=il_pvsyst, saturation_current=io_pvsyst, nNsVth=nnsvt_pvsyst) vd_pvsyst = np.linspace(0, voc_est_pvsyst, 1000) pvsyst = bishop88( diode_voltage=vd_pvsyst, photocurrent=il_pvsyst, saturation_current=io_pvsyst, resistance_series=rs_pvsyst, resistance_shunt=rsh_pvsyst, nNsVth=nnsvt_pvsyst, d2mutau=pvsyst_fs_495['d2mutau'], NsVbi=VOLTAGE_BUILTIN*pvsyst_fs_495['cells_in_series'] ) # test max power assert np.isclose(max(pvsyst[2]), expected['pmp'], *tol) # test short circuit current isc_pvsyst = np.interp(0, pvsyst[1], pvsyst[0]) assert np.isclose(isc_pvsyst, expected['isc'], *tol) # test open circuit voltage voc_pvsyst = np.interp(0, pvsyst[0][::-1], pvsyst[1][::-1]) assert np.isclose(voc_pvsyst, expected['voc'], *tol) # repeat tests as above with specialized bishop88 functions y = dict(d2mutau=pvsyst_fs_495['d2mutau'], NsVbi=VOLTAGE_BUILTIN*pvsyst_fs_495['cells_in_series']) mpp_88 = bishop88_mpp(*x, **y, method=method) assert np.isclose(mpp_88[2], expected['pmp'], *tol) isc_88 = bishop88_i_from_v(0, *x, **y, method=method) assert np.isclose(isc_88, expected['isc'], *tol) voc_88 = bishop88_v_from_i(0, *x, **y, method=method) assert np.isclose(voc_88, expected['voc'], *tol) ioc_88 = bishop88_i_from_v(voc_88, *x, **y, method=method) assert np.isclose(ioc_88, 0.0, *tol) vsc_88 = bishop88_v_from_i(isc_88, *x, **y, method=method) assert np.isclose(vsc_88, 0.0, *tol)
def test_numerical_precision(): """ Test that there are no numerical errors due to floating point arithmetic. """ expected = pd.read_csv(DATA_PATH) vdtest = np.linspace(0, estimate_voc(IL, I0, NNSVTH), IVCURVE_NPTS) results = bishop88(vdtest, *ARGS, gradients=True) assert np.allclose(expected['i'], results[0]) assert np.allclose(expected['v'], results[1]) assert np.allclose(expected['p'], results[2]) assert np.allclose(expected['grad_i'], results[3]) assert np.allclose(expected['grad_v'], results[4]) assert np.allclose(expected['grad'], results[5]) assert np.allclose(expected['grad_p'], results[6]) assert np.allclose(expected['grad2p'], results[7])
def simulate_full_curve(parameters, Geff, Tcell, ivcurve_pnts=1000): """ Use De Soto and Bishop to simulate a full IV curve with both forward and reverse bias regions. """ # adjust the reference parameters according to the operating # conditions using the De Soto model: sde_args = pvsystem.calcparams_desoto( Geff, Tcell, alpha_sc=parameters['alpha_sc'], a_ref=parameters['a_ref'], I_L_ref=parameters['I_L_ref'], I_o_ref=parameters['I_o_ref'], R_sh_ref=parameters['R_sh_ref'], R_s=parameters['R_s'], ) # sde_args has values: # (photocurrent, saturation_current, resistance_series, # resistance_shunt, nNsVth) # Use Bishop's method to calculate points on the IV curve with V ranging # from the reverse breakdown voltage to open circuit kwargs = { 'breakdown_factor': parameters['breakdown_factor'], 'breakdown_exp': parameters['breakdown_exp'], 'breakdown_voltage': parameters['breakdown_voltage'], } v_oc = singlediode.bishop88_v_from_i(0.0, *sde_args, **kwargs) # ideally would use some intelligent log-spacing to concentrate points # around the forward- and reverse-bias knees, but this is good enough: vd = np.linspace(0.99 * kwargs['breakdown_voltage'], v_oc, ivcurve_pnts) ivcurve_i, ivcurve_v, _ = singlediode.bishop88(vd, *sde_args, **kwargs) return pd.DataFrame({ 'i': ivcurve_i, 'v': ivcurve_v, })
def test_pvsyst_recombination_loss(poa, temp_cell, expected, tol): """test PVSst recombination loss""" pvsyst_fs_495 = get_pvsyst_fs_495() # first evaluate PVSyst model with thin-film recombination loss current # at reference conditions x = pvsystem.calcparams_pvsyst( effective_irradiance=poa, temp_cell=temp_cell, alpha_sc=pvsyst_fs_495['alpha_sc'], gamma_ref=pvsyst_fs_495['gamma_ref'], mu_gamma=pvsyst_fs_495['mu_gamma'], I_L_ref=pvsyst_fs_495['I_L_ref'], I_o_ref=pvsyst_fs_495['I_o_ref'], R_sh_ref=pvsyst_fs_495['R_sh_ref'], R_sh_0=pvsyst_fs_495['R_sh_0'], R_sh_exp=pvsyst_fs_495['R_sh_exp'], R_s=pvsyst_fs_495['R_s'], cells_in_series=pvsyst_fs_495['cells_in_series'], EgRef=pvsyst_fs_495['EgRef'] ) il_pvsyst, io_pvsyst, rs_pvsyst, rsh_pvsyst, nnsvt_pvsyst = x voc_est_pvsyst = estimate_voc(photocurrent=il_pvsyst, saturation_current=io_pvsyst, nNsVth=nnsvt_pvsyst) vd_pvsyst = np.linspace(0, voc_est_pvsyst, 1000) pvsyst = bishop88( diode_voltage=vd_pvsyst, photocurrent=il_pvsyst, saturation_current=io_pvsyst, resistance_series=rs_pvsyst, resistance_shunt=rsh_pvsyst, nNsVth=nnsvt_pvsyst, d2mutau=pvsyst_fs_495['d2mutau'], NsVbi=VOLTAGE_BUILTIN*pvsyst_fs_495['cells_in_series'] ) # test max power assert np.isclose(max(pvsyst[2]), expected['pmp'], *tol) # test short circuit current isc_pvsyst = np.interp(0, pvsyst[1], pvsyst[0]) assert np.isclose(isc_pvsyst, expected['isc'], *tol) # test open circuit current voc_pvsyst = np.interp(0, pvsyst[0][::-1], pvsyst[1][::-1]) assert np.isclose(voc_pvsyst, expected['voc'], *tol)
def test_pvsyst_recombination_loss(pvsyst_fs_495, poa, temp_cell, expected, tol): """test PVSst recombination loss""" # first evaluate PVSyst model with thin-film recombination loss current # at reference conditions x = pvsystem.calcparams_pvsyst( effective_irradiance=poa, temp_cell=temp_cell, alpha_sc=pvsyst_fs_495['alpha_sc'], gamma_ref=pvsyst_fs_495['gamma_ref'], mu_gamma=pvsyst_fs_495['mu_gamma'], I_L_ref=pvsyst_fs_495['I_L_ref'], I_o_ref=pvsyst_fs_495['I_o_ref'], R_sh_ref=pvsyst_fs_495['R_sh_ref'], R_sh_0=pvsyst_fs_495['R_sh_0'], R_sh_exp=pvsyst_fs_495['R_sh_exp'], R_s=pvsyst_fs_495['R_s'], cells_in_series=pvsyst_fs_495['cells_in_series'], EgRef=pvsyst_fs_495['EgRef'] ) il_pvsyst, io_pvsyst, rs_pvsyst, rsh_pvsyst, nnsvt_pvsyst = x voc_est_pvsyst = estimate_voc(photocurrent=il_pvsyst, saturation_current=io_pvsyst, nNsVth=nnsvt_pvsyst) vd_pvsyst = np.linspace(0, voc_est_pvsyst, 1000) pvsyst = bishop88( diode_voltage=vd_pvsyst, photocurrent=il_pvsyst, saturation_current=io_pvsyst, resistance_series=rs_pvsyst, resistance_shunt=rsh_pvsyst, nNsVth=nnsvt_pvsyst, d2mutau=pvsyst_fs_495['d2mutau'], NsVbi=VOLTAGE_BUILTIN*pvsyst_fs_495['cells_in_series'] ) # test max power assert np.isclose(max(pvsyst[2]), expected['pmp'], *tol) # test short circuit current isc_pvsyst = np.interp(0, pvsyst[1], pvsyst[0]) assert np.isclose(isc_pvsyst, expected['isc'], *tol) # test open circuit current voc_pvsyst = np.interp(0, pvsyst[0][::-1], pvsyst[1][::-1]) assert np.isclose(voc_pvsyst, expected['voc'], *tol)