Skip to content

Add guidance about IAM to User Guide#2683

Open
kandersolar wants to merge 2 commits intopvlib:mainfrom
kandersolar:iam-doc
Open

Add guidance about IAM to User Guide#2683
kandersolar wants to merge 2 commits intopvlib:mainfrom
kandersolar:iam-doc

Conversation

@kandersolar
Copy link
Member

@kandersolar kandersolar commented Feb 5, 2026

  • [ ] Closes #xxxx
  • I am familiar with the contributing guidelines
  • [ ] Tests added
  • [ ] Updates entries in docs/sphinx/source/reference for API changes.
  • Adds description and name entries in the appropriate "what's new" file in docs/sphinx/source/whatsnew for all changes. Includes link to the GitHub Issue with :issue:`num` or this Pull Request with :pull:`num`. Includes contributor name and/or GitHub username (link with :ghuser:`user`).
  • [ ] New code is fully documented. Includes numpydoc compliant docstrings, examples, and comments where necessary.
  • Pull request is nearly complete and ready for detailed review.
  • Maintainer: Appropriate GitHub Labels (including remote-data) and Milestone are assigned to the Pull Request and linked Issue.

Continuing in a broader thrust of developing our user guide section. Previously:

See also:

Docs build: https://pvlib-python--2683.org.readthedocs.build/en/2683/user_guide/modeling_topics/iam.html

@kandersolar kandersolar added this to the v0.15.1 milestone Feb 5, 2026
Copy link
Member

@RDaxini RDaxini left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice job @kandersolar , this is great. Thank you for putting this together! I left some comments on a few relatively minor things, but besides those few points this LGTM

+-------------------------------------------+---------+-------------------------------------------+
| :py:func:`~pvlib.iam.physical` | direct | Physics-based; optional AR coating |
+-------------------------------------------+---------+-------------------------------------------+
| :py:func:`~pvlib.iam.sapm` | direct | Can exhibit "wiggles" in the curve |
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think some clarification on what this "wiggles" comment means exactly might be helpful

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not strictly decreasing in AOI.

Types of models
---------------

IAM is sometimes applied only to the beam component of in-plane irradiance, as
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the target audience of this guide, it might not be obvious that "direct" (seen in the table under "type") is the same as "beam" (written here in the description). Let's equate the two somewhere/somehow, or just the same word.

where :math:`T(\theta)` represents the transmitted light fraction at AOI :math:`\theta`.
IAM equals (by definition) 1.0 when AOI is zero and typically approaches zero
as AOI approaches 90 degrees. The shape of the IAM profile at intermediate AOI
Copy link
Member

@RDaxini RDaxini Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
as AOI approaches 90 degrees. The shape of the IAM profile at intermediate AOI
as AOI approaches 90°. The shape of the IAM profile at intermediate AOI

If you get double spaces, then I get to say use the symbol with a number.
(I don't actually mind the double spaces, rumor is I actually like it, but you know I like teasing you for it regardless :D)

Module-specific values can be obtained via testing. For example, IEC 61853-2
testing produces measured IAM values across the range of AOI and a corresponding
parameter value for the Martin-Ruiz model. Parameter values for other models can
be determined using :py:func:`pvlib.iam.fit`. Parameter values can also be (approximately)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
be determined using :py:func:`pvlib.iam.fit`. Parameter values can also be (approximately)
be determined using :py:func:`pvlib.iam.fit`. Parameter values can also be approximately

Small thing but I'd vote to lose the parentheses... no room for grammatical nuances and soft qualifications in pvlib—let's be direct ;)

disclaimer: I won't die on that hill, leave them in if you prefer

@echedey-ls
Copy link
Member

I'm glad to see pvlib incorporating these guides. I'm sure it will be very useful at many knowledge stages.

My two cents are:

  • Maybe include at some point, even inside parentheses, a reference to circumsolar radiation usually being applied the direct IAM modifier.
  • Note that IAM is also dependent on the wavelength, but characterization simplifies that since spectral performance modelling is infrequent and it's easier to characterize.

Thanks @kandersolar for hauling this initiative.

@kandersolar
Copy link
Member Author

Note that IAM is also dependent on the wavelength, but characterization simplifies that since spectral performance modelling is infrequent and it's easier to characterize.

Good point. Reminder to add other missing aspects of these IAM models too:

  • Polarization
  • The light's "azimuth" angle, in the module's reference frame

:term:`aoi`) and the optical properties of the module.

Some reduction occurs at all angles of incidence, even normal incidence.
However, because PV module testing is performed at normal incidence,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
However, because PV module testing is performed at normal incidence,
However, because PV modules are rated with irradiance at normal incidence,

There are test protocols for measuring the IAM that steer modules away from normal to the solar vector.

Therefore, only the extra reduction at non-normal incidence should be modeled.

This is done using incidence angle modififer (:term:`IAM`) models. IAM is
the fraction of incident light that is transmitted to the PV cell, normalized
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm going to object here to the general statement "IAM is the fraction of incident light" without some qualification. It is either the incident direct or diffuse light, but (to my knowledge) never the combined, plane-of-array irradiance. Except for the physical IAM, every IAM model appears to have been developed and/or validated using either direct or diffuse irradiance. For example, the Martin-Ruize model was developed (I think, they don't say) by approximating a physics-based equation (akin to the physical IAM model) and was validated (this is clear) by using approximately collimated light.

The table below indicates a model "type" as either direct or diffuse, presumably, to inform a user how the model should be applied.

Would "Conceptually, IAM is the fraction of incident direct or diffuse light" be acceptable? That alleviates my concern. I'm adding "Conceptually" because some models may not have developed using transmittance values, but using Isc or some surrogate instead.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would "Conceptually, IAM is the fraction of incident direct or diffuse light" be acceptable?

I like it. I will make the edit.

+-------------------------------------------+---------+-------------------------------------------+
| :py:func:`~pvlib.iam.physical` | direct | Physics-based; optional AR coating |
+-------------------------------------------+---------+-------------------------------------------+
| :py:func:`~pvlib.iam.sapm` | direct | Can exhibit "wiggles" in the curve |
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not strictly decreasing in AOI.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants