@@ -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