@@ -450,3 +450,123 @@ def spectral_factor_sapm(airmass_absolute, module):
450450 spectral_loss = pd .Series (spectral_loss , airmass_absolute .index )
451451
452452 return spectral_loss
453+
454+
455+ def spectral_factor_caballero (precipitable_water , airmass_absolute , aod500 ,
456+ module_type = None , coefficients = None ):
457+ r"""
458+ Estimate a technology-specific spectral mismatch modifier from
459+ airmass, aerosol optical depth, and atmospheric precipitable water,
460+ using the Caballero model.
461+
462+ The model structure was motivated by examining the effect of these three
463+ atmospheric parameters on simulated irradiance spectra and spectral
464+ modifiers. However, the coefficient values reported in [1]_ and
465+ available here via the ``module_type`` parameter were determined
466+ by fitting the model equations to spectral factors calculated from
467+ global tilted spectral irradiance measurements taken in the city of
468+ Jaén, Spain. See [1]_ for details.
469+
470+ Parameters
471+ ----------
472+ precipitable_water : numeric
473+ atmospheric precipitable water. [cm]
474+
475+ airmass_absolute : numeric
476+ absolute (pressure-adjusted) airmass. [unitless]
477+
478+ aod500 : numeric
479+ atmospheric aerosol optical depth at 500 nm. [unitless]
480+
481+ module_type : str, optional
482+ One of the following PV technology strings from [1]_:
483+
484+ * ``'cdte'`` - anonymous CdTe module.
485+ * ``'monosi'``, - anonymous sc-si module.
486+ * ``'multisi'``, - anonymous mc-si- module.
487+ * ``'cigs'`` - anonymous copper indium gallium selenide module.
488+ * ``'asi'`` - anonymous amorphous silicon module.
489+ * ``'perovskite'`` - anonymous pervoskite module.
490+
491+ coefficients : array-like, optional
492+ user-defined coefficients, if not using one of the default coefficient
493+ sets via the ``module_type`` parameter.
494+
495+ Returns
496+ -------
497+ modifier: numeric
498+ spectral mismatch factor (unitless) which is multiplied
499+ with broadband irradiance reaching a module's cells to estimate
500+ effective irradiance, i.e., the irradiance that is converted to
501+ electrical current.
502+
503+ References
504+ ----------
505+ .. [1] Caballero, J.A., Fernández, E., Theristis, M.,
506+ Almonacid, F., and Nofuentes, G. "Spectral Corrections Based on
507+ Air Mass, Aerosol Optical Depth and Precipitable Water
508+ for PV Performance Modeling."
509+ IEEE Journal of Photovoltaics 2018, 8(2), 552-558.
510+ :doi:`10.1109/jphotov.2017.2787019`
511+ """
512+
513+ if module_type is None and coefficients is None :
514+ raise ValueError ('Must provide either `module_type` or `coefficients`' )
515+ if module_type is not None and coefficients is not None :
516+ raise ValueError ('Only one of `module_type` and `coefficients` should '
517+ 'be provided' )
518+
519+ # Experimental coefficients from [1]_.
520+ # The extra 0/1 coefficients at the end are used to enable/disable
521+ # terms to match the different equation forms in Table 1.
522+ _coefficients = {}
523+ _coefficients ['cdte' ] = (
524+ 1.0044 , 0.0095 , - 0.0037 , 0.0002 , 0.0000 , - 0.0046 ,
525+ - 0.0182 , 0 , 0.0095 , 0.0068 , 0 , 1 )
526+ _coefficients ['monosi' ] = (
527+ 0.9706 , 0.0377 , - 0.0123 , 0.0025 , - 0.0002 , 0.0159 ,
528+ - 0.0165 , 0 , - 0.0016 , - 0.0027 , 1 , 0 )
529+ _coefficients ['multisi' ] = (
530+ 0.9836 , 0.0254 , - 0.0085 , 0.0016 , - 0.0001 , 0.0094 ,
531+ - 0.0132 , 0 , - 0.0002 , - 0.0011 , 1 , 0 )
532+ _coefficients ['cigs' ] = (
533+ 0.9801 , 0.0283 , - 0.0092 , 0.0019 , - 0.0001 , 0.0117 ,
534+ - 0.0126 , 0 , - 0.0011 , - 0.0019 , 1 , 0 )
535+ _coefficients ['asi' ] = (
536+ 1.1060 , - 0.0848 , 0.0302 , - 0.0076 , 0.0006 , - 0.1283 ,
537+ 0.0986 , - 0.0254 , 0.0156 , 0.0146 , 1 , 0 )
538+ _coefficients ['perovskite' ] = (
539+ 1.0637 , - 0.0491 , 0.0180 , - 0.0047 , 0.0004 , - 0.0773 ,
540+ 0.0583 , - 0.0159 , 0.01251 , 0.0109 , 1 , 0 )
541+
542+ if module_type is not None :
543+ coeff = _coefficients [module_type ]
544+ else :
545+ coeff = coefficients
546+
547+ # Evaluate spectral correction factor
548+ ama = airmass_absolute
549+ aod500_ref = 0.084
550+ pw_ref = 1.4164
551+
552+ f_AM = (
553+ coeff [0 ]
554+ + coeff [1 ] * ama
555+ + coeff [2 ] * ama ** 2
556+ + coeff [3 ] * ama ** 3
557+ + coeff [4 ] * ama ** 4
558+ )
559+ # Eq 6, with Table 1
560+ f_AOD = (aod500 - aod500_ref ) * (
561+ coeff [5 ]
562+ + coeff [10 ] * coeff [6 ] * ama
563+ + coeff [11 ] * coeff [6 ] * np .log (ama )
564+ + coeff [7 ] * ama ** 2
565+ )
566+ # Eq 7, with Table 1
567+ f_PW = (precipitable_water - pw_ref ) * (
568+ coeff [8 ]
569+ + coeff [9 ] * np .log (ama )
570+ )
571+ modifier = f_AM + f_AOD + f_PW # Eq 5
572+ return modifier
0 commit comments