Skip to content

Commit 05f5408

Browse files
committed
add marion's adjustment
1 parent 74ded02 commit 05f5408

1 file changed

Lines changed: 52 additions & 2 deletions

File tree

pvlib/pvsystem.py

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2878,14 +2878,36 @@ def scale_voltage_current_power(data, voltage=1, current=1):
28782878

28792879
@renamed_kwarg_warning(
28802880
"0.13.0", "g_poa_effective", "effective_irradiance")
2881-
def pvwatts_dc(effective_irradiance, temp_cell, pdc0, gamma_pdc, temp_ref=25.):
2881+
def pvwatts_dc(effective_irradiance, temp_cell, pdc0, gamma_pdc, temp_ref=25.,
2882+
k=0.0, capped_adjustment=False):
28822883
r"""
2883-
Implements NREL's PVWatts DC power model. The PVWatts DC model [1]_ is:
2884+
Implements NREL's PVWatts (Version 5) DC power model. The PVWatts Version
2885+
5 DC model [1]_ is:
28842886
28852887
.. math::
28862888
28872889
P_{dc} = \frac{G_{poa eff}}{1000} P_{dc0} ( 1 + \gamma_{pdc} (T_{cell} - T_{ref}))
28882890
2891+
This model has also been referred to as the power temperature coefficient
2892+
model.
2893+
2894+
This function accepts an optional irradiance adjustment factor, `k`, based
2895+
on based on [2]_. This applies a piece-wise adjustment to power based on
2896+
irradiance, where `k` is the reduction in actual power at 200 W/m^2
2897+
relative to ideal power calculated linearly from standard test conditions,
2898+
normalized to nameplate power at standard test conditions.
2899+
2900+
.. math::
2901+
2902+
k=\frac{0.2P_{dc0}-P_{200}}{P_{dc0}}
2903+
2904+
For example, a 500 W module that produces 95 W at 200 W/m^2 (a 5% relative
2905+
reduction in efficiency) would have a value of `k` = 0.01.
2906+
2907+
This adjustment increases relative efficiency for irradiance above 1000
2908+
W/m^2, which may not be desired. An optional input, `capped_adjustment`,
2909+
modifies the adjustment from [2]_ to only apply below 1000 W/m^2.
2910+
28892911
Note that ``pdc0`` is also used as a symbol in
28902912
:py:func:`pvlib.inverter.pvwatts`. ``pdc0`` in this function refers to the DC
28912913
power of the modules at reference conditions. ``pdc0`` in
@@ -2909,6 +2931,11 @@ def pvwatts_dc(effective_irradiance, temp_cell, pdc0, gamma_pdc, temp_ref=25.):
29092931
temp_ref: numeric, default 25.0
29102932
Cell reference temperature. PVWatts defines it to be 25 C and
29112933
is included here for flexibility. [C]
2934+
k: numeric, default 0.005
2935+
Irradiance correction factor, defined in [2]_. [unitless]
2936+
modified_marion: Boolean, default False
2937+
Optional modification to [2]_, where no adjustment is applied above
2938+
1000 W/m^2.
29122939
29132940
Returns
29142941
-------
@@ -2920,11 +2947,34 @@ def pvwatts_dc(effective_irradiance, temp_cell, pdc0, gamma_pdc, temp_ref=25.):
29202947
.. [1] A. P. Dobos, "PVWatts Version 5 Manual"
29212948
http://pvwatts.nrel.gov/downloads/pvwattsv5.pdf
29222949
(2014).
2950+
.. [2] B. Marion, "Comparison of Predictive Models for
2951+
Photovoltaic Module Performance,"
2952+
https://doi.org/10.1109/PVSC.2008.4922586,
2953+
https://docs.nrel.gov/docs/fy08osti/42511.pdf
2954+
(2008).
29232955
""" # noqa: E501
29242956

29252957
pdc = (effective_irradiance * 0.001 * pdc0 *
29262958
(1 + gamma_pdc * (temp_cell - temp_ref)))
29272959

2960+
# apply Marion's correction if k is anything but zero
2961+
if k != 0:
2962+
err_1 = (k * (1 - (1 - effective_irradiance / 200)**4) /
2963+
(effective_irradiance / 1000))
2964+
err_2 = (k * (1000 - effective_irradiance) / (1000 - 200))
2965+
2966+
pdc_marion = np.where(effective_irradiance <= 200,
2967+
pdc * (1 - err_1),
2968+
pdc * (1 - err_2))
2969+
2970+
# "cap" Marion's correction at 1000 W/m^2
2971+
if capped_adjustment is True:
2972+
pdc_marion = np.where(effective_irradiance >= 1000,
2973+
pdc,
2974+
pdc_marion)
2975+
2976+
pdc = pdc_marion
2977+
29282978
return pdc
29292979

29302980

0 commit comments

Comments
 (0)