@@ -794,6 +794,116 @@ def spectral_factor_pvspec(airmass_absolute, clearsky_index,
794794 return mismatch
795795
796796
797+ def spectral_factor_jrc (airmass , clearsky_index , module_type = None ,
798+ coefficients = None ):
799+ r"""
800+ Estimate a technology-specific spectral mismatch modifier from
801+ airmass and clear sky index using the JRC model.
802+
803+ The JRC spectral mismatch model includes the effects of cloud cover on
804+ the irradiance spectrum. Model coefficients are derived using measurements
805+ of irradiance and module performance at the Joint Research Centre (JRC) in
806+ Ispra, Italy (45.80N, 8.62E). Coefficients for two module types are
807+ available via the ``module_type`` parameter. More details on the model can
808+ be found in [1]_.
809+
810+ Parameters
811+ ----------
812+ airmass : numeric
813+ relative airmass. [unitless]
814+
815+ clearsky_index: numeric
816+ clear sky index. [unitless]
817+
818+ module_type : str, optional
819+ One of the following PV technology strings from [1]_:
820+
821+ * ``'cdte'`` - anonymous CdTe module.
822+ * ``'multisi'`` - anonymous multicrystalline Si module.
823+
824+ coefficients : array-like, optional
825+ user-defined coefficients, if not using one of the default coefficient
826+ sets via the ``module_type`` parameter.
827+
828+ Returns
829+ -------
830+ mismatch: numeric
831+ spectral mismatch factor (unitless) which is multiplied
832+ with broadband irradiance reaching a module's cells to estimate
833+ effective irradiance, i.e., the irradiance that is converted to
834+ electrical current.
835+
836+ Notes
837+ -----
838+ The JRC model parameterises the spectral mismatch factor as a function
839+ of air mass and the clear sky index as follows:
840+
841+ .. math::
842+
843+ M = 1 + a_1(e^{-k_c}-e^{-1}) + a_2(k_c-1)+a_3(AM-1.5),
844+
845+ where :math:`M` is the spectral mismatch factor, :math:`k_c` is the clear
846+ sky index, :math:`AM` is the air mass, :math:`e` is Euler's number, and
847+ :math:`a_1, a_2, a_3` are module-specific coefficients. The :math:`a_n`
848+ coefficients available via the ``coefficients`` parameter differ from the
849+ :math:`k_n` coefficients documented in [1]_ in that they are normalised by
850+ the specific short-circuit current value, :math:`I_{sc0}^*`, which is the
851+ expected short-circuit current at standard test conditions indoors. The
852+ model used to estimate the air mass (denoted as :math:`AM`) is not stated
853+ in the original publication. The authors of [1]_ used the ESRA model [2]_
854+ to estimate the clear sky GHI for the clear sky index, which is the ratio
855+ of GHI to clear sky GHI. Also, prior to the calculation of :math:`k_c`, the
856+ irradiance measurements were corrected for angle of incidence using the
857+ Martin and Ruiz model [3]_.
858+
859+ References
860+ ----------
861+ .. [1] Huld, T., Sample, T., and Dunlop, E., 2009. A simple model
862+ for estimating the influence of spectrum variations on PV performance.
863+ In Proceedings of the 24th European Photovoltaic Solar Energy
864+ Conference, Hamburg, Germany pp. 3385-3389. 2009. Accessed at:
865+ https://www.researchgate.net/publication/256080247
866+ .. [2] Rigollier, C., Bauer, O., and Wald, L., 2000. On the clear sky model
867+ of the ESRA—European Solar Radiation Atlas—with respect to the Heliosat
868+ method. Solar energy, 68(1), pp.33-48.
869+ :doi:`10.1016/S0038-092X(99)00055-9`
870+ .. [3] Martin, N. and Ruiz, J. M., 2001. Calculation of the PV modules
871+ angular losses under field conditions by means of an analytical model.
872+ Solar Energy Materials and Solar Cells, 70(1), 25-38.
873+ :doi:`10.1016/S0927-0248(00)00408-6`
874+ """
875+
876+ _coefficients = {}
877+ _coefficients ['multisi' ] = (0.00172 , 0.000508 , 0.00000357 )
878+ _coefficients ['cdte' ] = (0.000643 , 0.000130 , 0.0000108 )
879+ # normalise coefficients by I*sc0, see [1]
880+ _coefficients = {
881+ 'multisi' : tuple (x / 0.00348 for x in _coefficients ['multisi' ]),
882+ 'cdte' : tuple (x / 0.001150 for x in _coefficients ['cdte' ])
883+ }
884+ if module_type is not None and coefficients is None :
885+ coefficients = _coefficients [module_type .lower ()]
886+ elif module_type is None and coefficients is not None :
887+ pass
888+ elif module_type is None and coefficients is None :
889+ raise ValueError ('No valid input provided, both module_type and ' +
890+ 'coefficients are None. module_type can be one of ' +
891+ ", " .join (_coefficients .keys ()))
892+ else :
893+ raise ValueError ('Cannot resolve input, must supply only one of ' +
894+ 'module_type and coefficients. module_type can be ' +
895+ 'one of' ", " .join (_coefficients .keys ()))
896+
897+ coeff = coefficients
898+ mismatch = (
899+ 1
900+ + coeff [0 ] * (np .exp (- clearsky_index ) - np .exp (- 1 ))
901+ + coeff [1 ] * (clearsky_index - 1 )
902+ + coeff [2 ] * (airmass - 1.5 )
903+ )
904+ return mismatch
905+
906+
797907def sr_to_qe (sr , wavelength = None , normalize = False ):
798908 """
799909 Convert spectral responsivities to quantum efficiencies.
0 commit comments