@@ -450,3 +450,123 @@ def spectral_factor_sapm(airmass_absolute, module):
450
450
spectral_loss = pd .Series (spectral_loss , airmass_absolute .index )
451
451
452
452
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