> ## Documentation Index
> Fetch the complete documentation index at: https://docs.plantpredict.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Incidence Angle Modifier (IAM)

export const SpectralEffects = () => <Tooltip tip="Changes in solar spectrum due to atmospheric path length, affecting PV module performance.">
    spectral effects
  </Tooltip>;

export const SolidAngle = () => <Tooltip tip="Three-dimensional angle subtended by a surface at a point, measured in steradians (sr).">
    solid angle
  </Tooltip>;

export const ARC = () => <Tooltip tip="Anti-Reflective Coating: thin optical layer on module glass that reduces reflection losses.">
    ARC
  </Tooltip>;

export const AbsorptionCoefficient = () => <Tooltip tip="Rate at which light intensity decreases per unit path length in a material (units: m⁻¹).">
    absorption coefficient
  </Tooltip>;

export const ViewFactor = () => <Tooltip tip="Fraction of radiation leaving one surface that reaches another; determined by geometry.">
    view factor
  </Tooltip>;

export const Transposition = () => <Tooltip tip="Converting horizontal irradiance components to plane-of-array (tilted surface) irradiance.">
    transposition
  </Tooltip>;

export const HorizonBrightening = () => <Tooltip tip="Enhanced diffuse irradiance near the horizon due to atmospheric scattering at low angles.">
    horizon brightening
  </Tooltip>;

export const Circumsolar = () => <Tooltip tip="Diffuse irradiance concentrated in a bright ring around the solar disk.">
    circumsolar
  </Tooltip>;

export const Anisotropic = () => <Tooltip tip="Varying with direction; describes diffuse irradiance with directional components (e.g., circumsolar, horizon brightening).">
    anisotropic
  </Tooltip>;

export const Isotropic = () => <Tooltip tip="Uniform in all directions; describes diffuse irradiance distributed evenly across the sky dome.">
    isotropic
  </Tooltip>;

export const Soiling = () => <Tooltip tip="Accumulation of dust, dirt, and debris on module surfaces, reducing light transmission and energy production.">
    soiling
  </Tooltip>;

export const AngleOfIncidence = () => <Tooltip tip="Angle between the sun's rays and the perpendicular to a surface; 0° when sun is directly facing the surface.">
    angle of incidence
  </Tooltip>;

## Summary

The Incidence Angle Modifier (IAM) quantifies optical losses when sunlight strikes a module at non-normal angles. PlantPredict implements five IAM models: None, ASHRAE, Sandia, Physical, and Custom Interpolation. IAM is applied separately to beam, sky diffuse, and ground-reflected irradiance components after <Soiling /> losses and before <SpectralEffects /> corrections.

## Inputs

| Name                          | Symbol                 | Units                | Description                                                           |
| ----------------------------- | ---------------------- | -------------------- | --------------------------------------------------------------------- |
| **Angle of Incidence**        | $\theta_{AOI}$         | degrees              | Angle between sun and module normal                                   |
| **Module Tilt Angle**         | $\beta_m$              | degrees              | Tilt angle of module from horizontal                                  |
| **Module Azimuth Angle**      | $\gamma_m$             | degrees              | Azimuth angle of module surface normal, measured clockwise from North |
| **ASHRAE IAM Parameter**      | $b_0$                  | —                    | Empirical coefficient for ASHRAE model                                |
| **Sandia Polynomial Factors** | $[b_0, b_1, ..., b_5]$ | degree⁻ⁱ (i = 0...5) | Polynomial coefficients for Sandia model                              |
| **Refractive Index**          | $n$                    | —                    | Glass refractive index (Physical model, default: 1.526)               |
| **ARC Refractive Index**      | $n_{ARC}$              | —                    | Anti-reflective coating refractive index (Physical model, optional)   |
| **Absorption Coefficient**    | $\alpha_{abs}$         | m⁻¹                  | Glass absorption coefficient (Physical model, default: 4.0)           |
| **Glass Thickness**           | $L_{glass}$            | m                    | Glass thickness (Physical model, default: 0.002)                      |
| **IAM Factor Pairs**          | $\{(\theta_i, f_i)\}$  | degrees, —           | User-defined table (Custom Interpolation model)                       |

***

## Outputs

| Name                          | Symbol      | Units | Description                                      |
| ----------------------------- | ----------- | ----- | ------------------------------------------------ |
| **Beam IAM Factor**           | $U_{IAM,B}$ | —     | IAM factor for beam irradiance (0-1)             |
| **Sky Diffuse IAM Factor**    | $U_{IAM,D}$ | —     | IAM factor for sky diffuse irradiance (0-1)      |
| **Ground Diffuse IAM Factor** | $U_{IAM,G}$ | —     | IAM factor for ground-reflected irradiance (0-1) |

***

## Detailed Description

The user selects a single IAM model (None, ASHRAE, Sandia, Physical, or Custom Interpolation), which is applied directly to beam irradiance. Sky diffuse and ground diffuse IAM require integrating IAM over a hemisphere of incidence angles. Depending on the selected model and software version, the hemisphere integration uses either the selected beam IAM curve or defaults to integrating using the ASHRAE model:

| Selected Model | Beam IAM          | Sky Diffuse IAM                         | Ground Diffuse IAM                      |
| -------------- | ----------------- | --------------------------------------- | --------------------------------------- |
| None           | 1                 | 1                                       | 1                                       |
| ASHRAE         | ASHRAE            | Hemisphere averaging (ASHRAE model)     | 1                                       |
| Sandia         | Sandia polynomial | Hemisphere integration (ASHRAE model)   | 1                                       |
| Physical       | Physical          | Hemisphere integration (Physical model) | Hemisphere integration (Physical model) |
| Custom (V08-)  | Cubic spline      | Hemisphere integration (ASHRAE model)   | 1                                       |
| Custom (V09+)  | Cubic spline      | Hemisphere integration (Custom curve)   | Hemisphere integration (Custom curve)   |

### Beam IAM Models

Beam IAM ($U_{IAM,B}$) is calculated based on the <AngleOfIncidence /> using one of five models.

#### None

No angle-dependent losses:

$$
U_{IAM,B} = 1
$$

#### ASHRAE

The ASHRAE model, originally derived by Souka and Safwat (1966) and later adopted by ASHRAE, uses a single empirical parameter $b_0$:

$$
U_{IAM,B} = 1 - b_0 \left( \frac{1}{\cos(\theta_{AOI})} - 1 \right)
$$

where $\theta_{AOI}$ is the angle of incidence. For $\theta_{AOI} > 87°$, $U_{IAM,B} = 0$.

#### Sandia

The Sandia model, developed by King et al. at Sandia National Laboratories, uses a 5th-order polynomial:

$$
U_{IAM,B} = 
\begin{cases}
1, & \theta_{AOI} < 34° \\
\sum_{i=0}^{5} b_i \theta_{AOI}^i, & \theta_{AOI} \geq 34°
\end{cases}
$$

where $\theta_{AOI}$ is in degrees and $[b_0, b_1, b_2, b_3, b_4, b_5]$ are polynomial factors empirically determined from experimental data.

#### Physical

The Physical model (Version 11+), developed by De Soto et al. based on optical equations from Duffie and Beckman, calculates IAM from first-principles optics:

$$
U_{IAM,B} = \frac{1-R(\theta_{AOI})}{1-R(0)} \cdot e^{-\alpha_{abs} L_{glass} \left(\frac{1}{\cos(\theta_{glass})} - 1\right)}
$$

where $R(\theta_{AOI})$ is the total Fresnel reflectance across interfaces, $\theta_{glass}$ is the refraction angle in glass, $\alpha_{abs}$ is the glass <AbsorptionCoefficient />, and $L_{glass}$ is the glass thickness.

**Refraction angles ([Snell's law](https://en.wikipedia.org/wiki/Snell%27s_law)):**

$$
\theta_{glass} = \arcsin\left(\frac{\sin(\theta_{AOI})}{n}\right), \quad \theta_{ARC} = \arcsin\left(\frac{\sin(\theta_{AOI})}{n_{ARC}}\right)
$$

**Total Fresnel reflectance:**

With <ARC /> (air → ARC → glass), accounting for multiple internal reflections:

$$
R(\theta_{AOI}) = 1 - \frac{(1-\rho_{air\text{-}ARC})(1-\rho_{ARC\text{-}glass})}{1 - \rho_{air\text{-}ARC}\rho_{ARC\text{-}glass}}
$$

where $\rho_{air\text{-}ARC}$ is the air-ARC reflectance (at angles $\theta_{AOI}$ and $\theta_{ARC}$) and $\rho_{ARC\text{-}glass}$ is the ARC-glass reflectance (at angles $\theta_{ARC}$ and $\theta_{glass}$).

**Interface reflectance ([Fresnel equations](https://en.wikipedia.org/wiki/Fresnel_equations), averaged over polarizations):**

$$
\rho_{air\text{-}ARC} = \frac{1}{2}\left[\left(\frac{\cos(\theta_{AOI}) - n_{ARC}\cos(\theta_{ARC})}{\cos(\theta_{AOI}) + n_{ARC}\cos(\theta_{ARC})}\right)^2 + \left(\frac{\cos(\theta_{ARC}) - n_{ARC}\cos(\theta_{AOI})}{\cos(\theta_{ARC}) + n_{ARC}\cos(\theta_{AOI})}\right)^2\right]
$$

$$
\rho_{ARC\text{-}glass} = \frac{1}{2}\left[\left(\frac{n_{ARC}\cos(\theta_{ARC}) - n\cos(\theta_{glass})}{n_{ARC}\cos(\theta_{ARC}) + n\cos(\theta_{glass})}\right)^2 + \left(\frac{n_{ARC}\cos(\theta_{glass}) - n\cos(\theta_{ARC})}{n_{ARC}\cos(\theta_{glass}) + n\cos(\theta_{ARC})}\right)^2\right]
$$

**Special case (no anti-reflective coating):**

Without anti-reflective coating, there is a single air-glass interface:

$$
R(\theta_{AOI}) = \rho_{air\text{-}glass}(\theta_{AOI})
$$

$$
\rho_{air\text{-}glass} = \frac{1}{2}\left[\left(\frac{\cos(\theta_{AOI}) - n\cos(\theta_{glass})}{\cos(\theta_{AOI}) + n\cos(\theta_{glass})}\right)^2 + \left(\frac{\cos(\theta_{glass}) - n\cos(\theta_{AOI})}{\cos(\theta_{glass}) + n\cos(\theta_{AOI})}\right)^2\right]
$$

#### Custom Interpolation

Users provide a table of IAM factor pairs $\{(\theta_i, f_i)\}$ measured or calculated at discrete incidence angles. These values typically come from module flash test reports or third-party optical modeling software.

For angles between the tabulated values, PlantPredict uses [cubic spline interpolation](https://en.wikipedia.org/wiki/Spline_interpolation). A cubic spline fits smooth polynomial curves between data points, ensuring continuity in both the function and its first derivative—avoiding the sharp corners that linear interpolation would produce.

$U_{IAM,B}$ is capped at 1 to prevent non-physical values from spline oscillation. For $\theta_{AOI} \geq 90°$, $U_{IAM,B} = 0$.

***

### Sky Diffuse IAM

Sky diffuse IAM ($U_{IAM,D}$) accounts for IAM effects on diffuse irradiance arriving from the sky hemisphere. The calculation assumes an <Isotropic /> sky; <Anisotropic /> radiance distributions (<Circumsolar />, <HorizonBrightening />) are handled by the <Transposition /> model.

For the None model, $U_{IAM,D} = 1$ since $U_{IAM,B} = 1$ at all angles. When ASHRAE is selected, a hemisphere average (arithmetic mean) is used. For Sandia and Custom (V08-), a projection-weighted hemisphere integration is computed analytically using the ASHRAE model. For Physical and Custom (V09+), this projection-weighted hemisphere integration is evaluated numerically with the actual IAM curve.

#### Hemisphere Averaging (ASHRAE)

When ASHRAE is selected as the IAM model, the sky diffuse IAM is approximated by averaging beam IAM values across the visible sky hemisphere (arithmetic mean with 1° × 1° steps):

$$
U_{IAM,D} = \frac{1}{N_{front}} \sum_{\gamma} \sum_{\phi} \left(1 - b_0\left(\frac{1}{\cos\theta_i(\phi, \gamma)} - 1\right)\right) \quad \text{for } \theta_i < 90°
$$

where $\phi$ is the polar angle (from zenith) and $\gamma$ is the azimuth angle defining the direction of a 1° × 1° element of the sky hemisphere. $N_{front}$ is the count of sky directions where $\theta_i(\phi, \gamma) < 90°$ (in front of the module plane). This is an unweighted average over discrete sky directions.

The incidence angle $\theta_i(\phi, \gamma)$ for each sky direction on a tilted surface is:

$$
\cos\theta_i(\phi, \gamma) = \sin(\phi)\sin(\beta_m)\cos(\gamma - \gamma_m) + \cos(\phi)\cos(\beta_m)
$$

where $\beta_m$ is the module tilt and $\gamma_m$ is the module azimuth.

#### Hemisphere Integration (Sandia, Physical, Custom)

For Sandia, Physical, and Custom IAM models, the sky diffuse IAM is calculated by integrating beam IAM over the sky hemisphere, weighted by the projection onto the tilted surface:

$$
U_{IAM,D} = \frac{\int_{\text{sky}} U_{IAM,B}(\theta_i) \cos(\theta_i) \, d\Omega}{\int_{\text{sky}} \cos(\theta_i) \, d\Omega}
$$

The incidence angle $\theta_i$ for a sky element at polar angle $\phi$ and azimuth $\gamma$ on a surface tilted at $\beta_m$ with azimuth $\gamma_m$ is:

$$
\cos(\theta_i) = \sin(\phi)\sin(\beta_m)\cos(\gamma - \gamma_m) + \cos(\phi)\cos(\beta_m)
$$

The integration is limited to the portion of the sky **visible from the module front surface** — directions where $\cos(\theta_i) > 0$. Sky directions behind the module plane (where $\cos(\theta_i) \leq 0$) are excluded from both numerator and denominator.

**Implementation by model:**

**Sandia and Custom (V08-):** Use the ASHRAE model for diffuse IAM, which allows a closed-form analytical solution:

$$
U_{IAM,D} = 1 - b_0 \cdot \frac{3 - \cos\beta_m - \frac{4\beta_m}{\pi}}{1 + \cos\beta_m}
$$

**Physical and Custom (V09+):** For arbitrary IAM curves, the integral is evaluated numerically as described by Marion: the IAM is interpolated at discrete angles and integrated over the hemisphere.

***

### Ground Diffuse IAM

Ground-reflected irradiance IAM is handled differently from beam and sky diffuse because IAM effects on ground-reflected irradiance are already incorporated in the [ground shading model](/models/shading/ground_reflected_shading).

The ground shading algorithm calculates <ViewFactor />s from the ground to the tilted module surface, and applies the ASHRAE IAM model during this integration. This accounts for angle-dependent losses as light reflects from the ground and strikes the module at various angles. For most IAM models, $U_{IAM,G} = 1$ to avoid double-counting.

For Physical and Custom (V09+) models, $U_{IAM,G}$ is calculated via hemisphere integration over the ground-facing hemisphere. The integration uses the same projection-weighted approach as sky diffuse IAM, but integrates over the <SolidAngle /> subtended by the ground as seen from the module surface:

$$
U_{IAM,G} = \frac{\int_{\text{ground}} U_{IAM,B}(\theta_i) \cos(\theta_i) \, d\Omega}{\int_{\text{ground}} \cos(\theta_i) \, d\Omega}
$$

where the integration domain covers directions below the module's horizon (i.e., the hemisphere facing the ground). This may result in some double-counting with the ground shading model's built-in IAM treatment.

***

### Application to Irradiance

IAM factors are applied to irradiance components after soiling:

$$
G_{beam,IAM} = G_{beam,soiled} \times U_{IAM,B}
$$

$$
G_{sky,IAM} = G_{sky,soiled} \times U_{IAM,D}
$$

$$
G_{ground,IAM} = G_{ground,soiled} \times U_{IAM,G}
$$

***

## References

* Souka, A. F., & Safwat, H. H. (1966). Determination of the optimum orientations for the double exposure flat-plate collector and its reflections. *Solar Energy*, 10(4), 170–174. DOI: [10.1016/0038-092X(66)90004-1](https://doi.org/10.1016/0038-092X\(66\)90004-1)
* ASHRAE Standard 93-77. (1977). *Methods of Testing to Determine the Thermal Performance of Solar Collectors.* American Society of Heating, Refrigerating and Air-Conditioning Engineers.
* King, D. L., Boyson, W. E., & Kratochvil, J. A. (2004). *Photovoltaic array performance model.* SAND2004-3535, Sandia National Laboratories. DOI: [10.2172/919131](https://doi.org/10.2172/919131)
* Duffie, J. A., & Beckman, W. A. (2013). *Solar Engineering of Thermal Processes* (4th ed., Chapter 5). John Wiley & Sons. DOI: [10.1002/9781118671603](https://doi.org/10.1002/9781118671603)
* De Soto, W. (2004). *Improvement and Validation of a Model for Photovoltaic Array Performance.* Master's thesis, University of Wisconsin-Madison.
* Marion, B. (2017). *Numerical method for angle-of-incidence correction factors for diffuse radiation incident photovoltaic modules.* Solar Energy, 147, 344–348. DOI: [10.1016/j.solener.2017.03.027](https://doi.org/10.1016/j.solener.2017.03.027)
