Key takeaways
- With pvlib 0.16.1 default coefficients, Martin-Ruiz gives IAM 0.958 at 60 degrees (4.2% loss) and 0.663 at 80 degrees. ASHRAE gives 0.950 and 0.762.
- In an example 40°N clear-sky case, a fixed 30° plane loses 1.6% to 2.1% of beam energy to IAM. Only 10.4% of that energy arrives at 60° or more.
- Coefficients move the result more than model names do. At the same site, Martin-Ruiz a_r of 0.08 gives 0.3% and 0.25 gives 4.5%.
- Measured curves differ from defaults. One lab report prints IAM 0.9631 at 60° and 0.6778 at 80° for one module.
- An older manufacturer note prints 91.1% at 70° for anti-reflective (AR) glass, against 87.0% without.
To set the IAM model and curve in software, see the best solar simulation software for IAM and loss modelling.
IAM at a glance
IAM is a unitless factor between 0 and 1 that multiplies the direct light reaching the cells. Sandia’s PVPMC page says: "When the angle of incidence is greater than zero, there are optical losses due to increased reflections".
| Item | Detail |
|---|---|
| Formula | IAM = τ(θ) ÷ τ(0), where τ is transmittance (Sandia PVPMC). Models give it as a curve in the angle θ. |
| Unit and range | Unitless. 1 at 0°, falling to 0 at 90° in the models below. A measured value can sit a little above 1 within its uncertainty. |
| Where it matters | Yield simulation, loss diagrams, module comparison, glass and coating choice, low-sun hours. |
| Standard or rule | No single rule. The measured table below follows an IEC 61853-2:2016 outdoor method, as its report states. This page does not copy the standard. |
| In software | A model plus parameters, set in the module record or by the tool. |
Why IAM matters for installers
IAM is a small yearly loss, but it can still separate two modules. A wrong IAM setting can move the result by up to about 4 points of beam light at tilt 30° (Table 4).
Nameplate power is rated at normal incidence (standard test conditions), so IAM is a loss outside that rating. It is separate from the cosine effect. Beam light on a plane is already DNI × cos(AOI), where AOI is the angle of incidence, and IAM acts on what then reaches the cells. The DNI page, plane-of-array irradiance and the loss diagram cover the rest.
Figure 1. Four IAM models stay within 0.02 of each other up to 60°. The yearly loss is small because few hours arrive at high angles (example site, clear sky).
Which IAM models do solar tools use?
Sandia’s PVPMC lists three: a physical model, the ASHRAE model and the Martin and Ruiz model. pvlib adds the Sandia Array Performance Model (SAPM). It also adds an interpolation of measured values. Each needs parameters that depend on the module.
- Physical (Fresnel and Snell). pvlib’s function takes three inputs. They are a glass refractive index (default 1.526), an extinction coefficient K (4.0 per metre) and a thickness L (0.002 m). A coating index is optional, and 1.29 is given as typical. It follows De Soto et al. (2006), Section 3. PVsyst’s Fresnel option models the air-glass and glass-EVA interfaces. It says it does not model light trapping or multiple reflections.
- ASHRAE. IAM = 1 − b (sec(aoi) − 1), with b defaulting to 0.05 in pvlib. PVsyst’s help gives about 0.1 for single-glazed thermal modules. It gives 0.05 from measurements on real crystalline modules. pvlib returns zero at 90° or more and clips negatives. PVsyst marks ASHRAE as deprecated.
- Martin-Ruiz. IAM = (1 − exp(−cos(aoi) ÷ a_r)) ÷ (1 − exp(−1 ÷ a_r)). pvlib sets a_r to 0.16 by default. It calls 0.08 to 0.25 typical for flat-plate modules. Sandia calls a_r an empirical parameter "to fit in each case".
- SAPM. pvlib takes a dictionary of module parameters. Its notes say values a little above 1 can occur at about 15° to 40°. Users may cap them at 1. PVsyst’s Sandia option is a fifth-order polynomial. It is deprecated, and it is not for modules outside the Sandia database.
Table 1. IAM by model at pvlib’s default coefficients (pvlib 0.16.1, no coefficient is fitted to a module).
| Angle of incidence | Martin-Ruiz, a_r 0.16 | ASHRAE, b 0.05 | Physical, no coating | Physical, coating 1.29 |
|---|---|---|---|---|
| 0° | 1.000 | 1.000 | 1.000 | 1.000 |
| 30° | 0.997 | 0.992 | 0.998 | 0.998 |
| 50° | 0.984 | 0.972 | 0.980 | 0.986 |
| 60° | 0.958 | 0.950 | 0.946 | 0.961 |
| 70° | 0.884 | 0.904 | 0.860 | 0.890 |
| 80° | 0.663 | 0.762 | 0.634 | 0.677 |
| 85° | 0.421 | 0.476 | 0.401 | 0.436 |
In this table ASHRAE sits below the physical default up to about 58°. Beyond that it sits above. PVsyst’s help says ASHRAE underestimates IAM at 30° to 60° and overestimates it above 60°. The models agree at low angles. They part from 70°, where little energy arrives.
What do measured IAM tables and datasheets show?
A measured IAM table comes from a test report. CFV Solar Test Laboratory’s report 20125-PR-E-005 (hosted by Sandia PVPMC) prints 14 angles for a Canadian Solar CS6K-275M. Its outdoor method follows IEC 61853-2:2016 and Sandia procedure SAND2016-5284, as the report states.
Table 2. Measured IAM for one module against Martin-Ruiz at the default and at our fitted value (14 measured angles in all).
| Angle | Measured (k=2 uncertainty) | Martin-Ruiz 0.16 | Martin-Ruiz 0.152 (our fit) |
|---|---|---|---|
| 50° | 0.9911 (±0.006) | 0.9839 | 0.9870 |
| 60° | 0.9631 (±0.010) | 0.9579 | 0.9644 |
| 70° | 0.8922 (±0.016) | 0.8838 | 0.8966 |
| 80° | 0.6778 (±0.033) | 0.6635 | 0.6831 |
| 85° | 0.4541 (±0.057) | 0.4208 | 0.4380 |
Table 2b. The same angles for the other two models at their defaults.
| Angle | ASHRAE 0.05 | Physical default |
|---|---|---|
| 50° | 0.9722 | 0.9798 |
| 60° | 0.9500 | 0.9460 |
| 70° | 0.9038 | 0.8597 |
| 80° | 0.7621 | 0.6341 |
| 85° | 0.4763 | 0.4009 |
Across all 14 angles the root-mean-square gap to the measured values is 0.011 for Martin-Ruiz at 0.16. It is 0.0055 at our fitted 0.152. For ASHRAE at 0.05 it is 0.028. That is one module. It shows what a fit does, not which model is best. The same report prints 1.0014 at 20° (±0.004), so measured IAM can exceed 1.
None of the four datasheets reviewed prints a table. The JA Solar sheets (Global_EN_20190703A and Global_EN_20221104A) print no IAM values. The Trina sheets (TSM_EN_2024_A and TSM_EN_2023_A) list "Excellent IAM (Incident Angle Modifier)" as a feature bullet with no angles. PVsyst’s help says some makers are known to overestimate IAM performance. It asks for a detailed independent indoor lab report.
How does anti-reflective glass change IAM?
An anti-reflective coating cuts reflection, so IAM falls less at high angles. REC Solar’s January 2014 note (NE-18-09) covers its Peak Energy series, with reflectance tests by SERIS. It prints both glass types. It is an older note on one product series, so treat it as an example, not a current rating.
Table 3. REC note values (distributor-hosted copy) beside pvlib’s physical model. All columns are in per cent, not the 0 to 1 factors of Tables 1 and 2.
| Angle | REC, non-treated glass (%) | REC, AR-treated glass (%) | Physical, no coating (%) | Physical, coating 1.29 (%) |
|---|---|---|---|---|
| 50° | 98.5 | 99.4 | 98.0 | 98.6 |
| 60° | 95.3 | 97.4 | 94.6 | 96.1 |
| 70° | 87.0 | 91.1 | 86.0 | 89.0 |
| 80° | 67.7 | 72.2 | 63.4 | 67.7 |
The direction agrees. The sizes differ because the modules and inputs differ. PVsyst’s help says coating lifetime is poorly documented. It also says "PVsyst does not model any IAM changes from potential AR coating degradation". See anti-reflection coating and solar panel module.
Worked example: how much IAM costs over a year
In this example’s clear-sky case, IAM removed 1.6% to 2.1% of the beam light on a fixed 30° plane. The coefficients are pvlib’s defaults. The method has five steps.
- For each hour with the sun up, find the angle of incidence on the plane.
- Beam on the plane = DNI × cos(AOI), as on the DNI page.
- Look up IAM for that angle from a model.
- Effective beam = beam × IAM.
- Yearly loss = 1 − (sum of effective beam ÷ sum of beam).
Inputs (example): latitude 40°N, longitude 100°W, sea level, 8,760 hourly values, Ineichen clear sky with Linke turbidity 3.0, plane facing south. The fixed 30° plane receives 2,070 kWh/m² of clear-sky beam. Diffuse and ground-reflected light are left out.
Across six settings and four tilts the loss runs from 0.3% to 12.1%. Tilt 30° is the lowest in every row.
Table 4. Yearly beam-only IAM loss (%), example site and clear sky.
| Model (coefficient) | Tilt 10° | Tilt 30° | Tilt 60° | Tilt 90° |
|---|---|---|---|---|
| ASHRAE, b 0.05 | 2.9 | 2.1 | 2.6 | 5.6 |
| Martin-Ruiz, a_r 0.16 | 2.6 | 1.8 | 2.2 | 5.9 |
| Martin-Ruiz, a_r 0.08 | 0.4 | 0.3 | 0.4 | 1.4 |
| Martin-Ruiz, a_r 0.25 | 6.4 | 4.5 | 5.4 | 12.1 |
| Physical, no coating | 3.1 | 2.1 | 2.6 | 6.9 |
| Physical, coating 1.29 | 2.4 | 1.6 | 2.0 | 5.6 |
At tilt 30°, 10.4% of beam energy arrives at 60° or more. Then 3.7% arrives at 70° or more. That is why a 34% loss at 80° costs only about 2% over the year. A vertical plane sees 33.0% of its beam at 60° or more. Its loss is larger. Here the coating cuts the loss by about 0.5 points at tilt 30°. Real weather has more diffuse light. Diffuse light has its own angular loss. So treat these as beam-only teaching figures.
Calculator: IAM at one angle and a yearly weighted loss
Part A gives IAM for Martin-Ruiz and ASHRAE at one angle. You can enter the module’s IAM at 50° instead of b. The calculator takes values of 0.7221 or more, because that is the IAM at 50° when b is 0.5, the largest b it allows. Part B weights seven angle bands. The defaults are the example tilt-30° shares.
How solar software handles IAM
PVsyst, pvlib, PV*SOL and Solargis Prospect document IAM on their own help or docs pages. SAM and HelioScope do so only in part. The entries judge documentation, not model quality.
| Software | Documents IAM? | Method |
|---|---|---|
| PVsyst | Yes | Modelled |
| pvlib python | Yes | Library you code against |
| PV*SOL premium | Yes | Modelled |
| Solargis Prospect | Yes | Modelled |
| SAM | Partly | Modelled |
| HelioScope | Partly | Modelled |
Partly: SAM rests on a forum reply, and HelioScope names a reflection loss but not IAM.
- PVsyst: Fresnel by default since 6.67 with a front-surface material (normal glass, AR coating, textured glass, plastic). ASHRAE and Sandia marked deprecated. User-defined profile allowed. Set in the PAN file under Customized IAM. Applied to beam, diffuse and albedo. Notes: PVsyst help, "Array incidence loss (IAM)", no date shown, checked October 2026.
- pvlib python: pvlib.iam has physical, ashrae, martin_ruiz, sapm, interp, schlick and fit, among others. Notes: pvlib 0.16.1 docs, checked October 2026.
- PV*SOL premium: Reflection page uses the ASHRAE model. The module data gives IAM at 50°, from which b is calculated. Notes: PV*SOL help, "Reflection in module plane", no date shown, checked October 2026.
- Solargis Prospect: Knowledge base says Prospect uses the same Martin and Ruiz model as Evaluate. Notes: Solargis "Incident irradiance", updated 23 July 2026, checked October 2026.
- SAM: A reply on the SAM forum, in SAM’s voice (16 October 2015), says the CEC model uses the cover’s optical qualities. It says the Sandia model uses a b0 to b5 polynomial and losses show inside "Module loss". Notes: Forum reply, not SAM help. Checked October 2026.
- HelioScope: Loss Factors page has a "Reflection" row, -1% to -5%, "Based on reflection of light from shallow angles". IAM and the model are not named. Notes: HelioScope help centre, no date shown, checked October 2026.
To find tools that let you set the IAM model and curve, see the best solar simulation software. See also pvlib and energy yield simulation.
Common mistakes with IAM
FAQs
Does IAM apply to diffuse and ground-reflected light?
Yes, in tools that model it. PVsyst’s help applies the IAM function to beam, diffuse and albedo. It integrates over all visible directions with isotropic diffuse light. pvlib lists separate diffuse functions. The figures above are beam only.
Can IAM be above 1?
Yes, in measured data and one model. The CFV report prints 1.0014 at 20° with ±0.004 uncertainty. pvlib’s SAPM notes also allow values above 1.
Where do I find a module’s IAM?
Ask the maker for a test report or a PAN file that has IAM values. The datasheets reviewed here list IAM only as a feature bullet or not at all. A measured table comes from a lab report, like the CFV report above.
What is a typical yearly IAM loss?
In an example clear-sky case, a fixed 30° plane loses roughly 0.3% to 4.5% of beam light, depending on the coefficient. With pvlib’s default coefficients it is about 1.6% to 2.1%. Few hours arrive at high angles, so the loss stays small. Table 4 gives each model and tilt. Diffuse light is not included.
Related terms
- DNI: the beam light IAM acts on.
- Plane-of-array irradiance: light on the module plane.
- System losses and loss diagram: where the reflection line sits.
- PVsyst report: shows an IAM line.
- Performance ratio: IAM lowers it.
- Derate factor: how PVWatts handles reflection.
Next step: ask the maker for your module’s IAM table or PAN file, then test it in a tool from the best solar simulation software list.
Sources
- Sandia PVPMC, Incident Angle Reflection Losses (page metadata updated 14 December 2023, checked October 2026).
- Sandia PVPMC, Martin and Ruiz IAM Model (page metadata updated 13 January 2025, checked October 2026).
- pvlib 0.16.1 documentation: incident angle modifiers, physical, ashrae, martin_ruiz, sapm (checked October 2026).
- PVsyst help, Array incidence loss (IAM) (no date shown, checked October 2026).
- PV*SOL help, Reflection in module plane (no date shown, checked October 2026).
- Solargis knowledge base, Incident irradiance (updated 23 July 2026, checked October 2026).
- CFV Solar Test Laboratory, report 20125-PR-E-005, IAM and NMOT testing of Canadian Solar CS6K-275M (17 December 2020, checked October 2026).
- REC Solar, Accounting for reflection in system calculations (January 2014, NE-18-09, distributor-hosted copy, Table 2 values re-read 30 October 2026).
- SAM forum, Modeling IAM losses in SAM (replies 16 to 20 October 2015, link moved to the nlr.gov domain after the lab’s 2025 rename, checked November 2026).
- HelioScope help centre, Loss Factors in HelioScope (no date shown, checked October 2026).
- Datasheets: JA Solar JAM72D09 (Global_EN_20190703A) and JAM54D40 (Global_EN_20221104A). Trina TSM-DEG18MC.20(II) (TSM_EN_2024_A) and TSM-DE18 (TSM_EN_2023_A) (checked October 2026).
Last updated 30 October 2026. Next scheduled review: 30 January 2027.