Radiation Conversion Modeling#
This page documents how SunPeek converts available radiation measurements into the tilted irradiance components used by collector arrays.
The current implementation focuses on the practically important case where only
one measured global irradiance sensor is available in the plane of a radiation
sensor. In SunPeek this sensor is mapped to the array input slot in_global.
Terminology#
SunPeek uses the following radiation quantities:
Symbol / slot |
Name |
Meaning |
|---|---|---|
|
measured global irradiance |
Hemispherical irradiance measured in the plane of the mapped sensor. |
|
measured diffuse irradiance |
Diffuse irradiance measured in the plane of the mapped sensor. |
|
measured beam irradiance |
Beam irradiance measured in the plane of the mapped sensor. |
|
measured direct normal irradiance |
Direct irradiance measure normal to the sun beam. |
|
global tilted irradiance |
Global irradiance in the plane of collector array (POA). |
|
beam tilted irradiance |
Direct/beam component in the POA. |
|
diffuse tilted irradiance |
Diffuse component in the POA. |
|
global horizontal irradiance |
Global irradiance on the horizontal plane. |
|
diffuse horizontal irradiance |
Diffuse irradiance on the horizontal plane. |
|
direct normal irradiance |
Direct irradiance measure normal to the sun beam. |
|
angle of incidence |
Angle between the sun beam and the surface normal. |
The measured in_global value is not automatically the same as rd_gti.
They are identical only if the radiation sensor plane and the collector array
plane have the same tilt and azimuth.
Input slots and supported strategy#
Array radiation conversion uses four standard input slots:
in_global, in_beam, in_diffuse, in_dni
The currently implemented radiation-model strategy handles the input pattern:
1000 = in_global only
This means:
in_globalis availablein_beamis not availablein_diffuseis not availablein_dniis not available
For this case SunPeek uses reverse transposition to estimate horizontal irradiance components from the measured global irradiance in the sensor plane. Those horizontal components are then transposed into the collector array plane.
DNI-only input, i.e. input pattern 0001, is not sufficient to calculate the
full set of tilted components. DNI defines the direct normal beam component, but
it does not define the diffuse irradiance contribution. Therefore SunPeek does
not calculate rd_gti, rd_bti and rd_dti from in_dni alone.
Implemented model chain#
The implemented model chain is:
measured global irradiance in sensor plane
-> reverse transposition
-> GHI, DNI, DHI
-> forward transposition
-> rd_gti, rd_bti, rd_dti in collector array plane
In code this is implemented in:
The core model functions live in
sunpeek.core_methods.virtuals.radiation:
get_horizontal_from_poa_global(...)
get_poa_from_horizontal(...)
get_array_irradiance_from_measured_poa_global(...)
The virtual sensor strategy in
StrategyTiltedIrradiance_reverse_transposition
only orchestrates sensor access, orientation handling, and conversion of the
numeric model result back to unit-aware virtual sensor series.
Step 1: reverse transposition#
The first step estimates horizontal irradiance components from the measured global plane-of-array irradiance:
measured GTI_sensor -> GHI, DNI, DHI
SunPeek uses pvlib.irradiance.gti_dirint() for this step.
Required inputs are:
measured global irradiance in the sensor plane
sensor tilt and azimuth
solar zenith and azimuth
timestamp index
ground albedo (default=0.25 (pvlib default value))
The AOI for the radiation sensor plane is calculated with
pvlib.irradiance.aoi().
The implementation uses the perez-driesse model option. The
delta_kt_prime stability index is used only when the time index is regular
and sufficiently short-spaced. For very short, irregular, or coarse time series,
SunPeek disables it so virtual sensor calculations can still run on small data
windows.
Step 2: forward transposition#
The second step transposes the estimated horizontal components into the collector array plane:
GHI, DNI, DHI -> POA global, POA direct, POA diffuse
SunPeek uses pvlib.irradiance.get_total_irradiance() with the
perez-driesse model for this step.
The returned plane-of-array components are mapped to SunPeek virtual sensors:
poa_global -> rd_gti
poa_direct -> rd_bti
poa_diffuse -> rd_dti
Same-plane preservation#
If the radiation sensor plane and the collector array plane have the same orientation, SunPeek preserves the measured global irradiance:
The beam component is still calculated from the modeled horizontal components. The diffuse component is then calculated by closure:
This keeps the modeled output consistent with the measured global irradiance in the collector plane. In this same-plane case, the following relationship is enforced:
If the sensor plane and collector plane differ, SunPeek uses the forward transposed
poa_global and poa_diffuse values.
Orientation metadata#
Reverse transposition requires orientation metadata for the measured
in_global sensor:
tiltazim
For fixed-mounted arrays, the collector array orientation is taken from the array mounting configuration.
Single-axis tracking arrays are not supported by the current reverse transposition strategy. For tracking arrays, the sensor plane and collector plane can change relative to each other over time, and additional model design is required.
Validity limits#
Reverse transposition from measured GTI is less reliable for high incidence
angles. The pvlib documentation for pvlib.irradiance.gti_dirint() notes
poor model performance for approximately:
AOI > 80 deg
AND
POA irradiance > 200 W/m²
The AOI limit is consistent with Marion’s GTI-DIRINT validation discussion, where increased errors are reported for incidence angles in the 80–90 deg range. The exact 200 W/m² irradiance threshold is taken from the pvlib implementation documentation and should therefore be treated as a pvlib-recommended practical validity flag rather than a separately derived threshold from Marion (2015).
SunPeek currently uses these limits in validation and diagnostic comparisons.
Validation comparisons keep only timestamps with AOI <= 80 deg or POA irradiance <= 200 W/m².
Equivalently, they exclude timestamps where both limits are exceeded at the
same time. The core model does not yet mask or remove calculated values inside
this documented poor-performance region.
A future implementation may expose a helper or virtual sensor such as:
rd_conversion_valid
or a function equivalent to:
valid = (aoi <= 80) | (poa_global <= 200)
Validation approach#
The implementation is validated with FHW operational demo data.
The validation uses measured rd_gti as the only model input and keeps
measured rd_bti, rd_dti and rd_dni as independent references.
For the yearly FHW validation, comparisons are filtered to timestamps with:
reference AOI <= 80 deg
OR
reference GTI <= 200 W/m²
The test suite checks:
successful calculation from
in_globalonly;explicit feedthrough behavior;
same-plane GTI preservation;
closure
rd_gti = rd_bti + rd_dti;yearly agreement with measured BTI and DTI;
direct helper behavior in
sunpeek.core_methods.virtuals.radiation.
Measured DNI is available in the FHW data and can be used to validate the
intermediate DNI estimated by reverse transposition. This is useful because DNI
is an internal model result that strongly affects the calculated beam tilted
irradiance. It should be treated as an additional model validation, not as an
input for the in_global-only strategy.
Example validation plots#
The following figures show an example validation window from the FHW yearly
demo data. The model uses only measured rd_gti as input. The measured
rd_bti and rd_dti sensors are shown only as independent references.
Modeled and measured tilted radiation components for a selected June time window. The plot compares modeled BTI and DTI against the corresponding measured FHW reference sensors.#
Error time series for the same June validation window, calculated as modeled minus measured irradiance.#
Power Check validation#
The radiation conversion also changes the automatic Power Check strategy
selection. Since BTI/DTI can be modeled from in_global, the Power Check
can be calculated using Formula 2 instead of Formula 1.
This behavior is validated with the yearly FHW demo data. The test compares three Power Check runs:
Formula 2 with measured
rd_btiandrd_dti. This is used as the reference because it applies the same Power Check formula with independently measured radiation components.Formula 1 with measured
rd_gti. This represents the previous fallback when only global tilted irradiance is available.Formula 2 with modeled
rd_btiandrd_dtifrom measuredrd_gti. This represents the new radiation-conversion workflow.
The comparison is performed on common ISO Power Check intervals only, because Formula 1 and Formula 2 apply different irradiance restrictions and may therefore select different valid intervals.
Power Check output of (left) Formula 1 using measured GTI and (right) Formula 2 using modeled BTI/DTI, compared to the reference case using Formula 2 with measured BTI/DTI.#
All three approaches have similar performance for the FHW demo data, though Formula 2 using modeled BTI/DTI has a smaller mean absolute error and a smaller absolute bias than Formula 1. For other locations, Formula 2 using modeled BTI/DTI may have a larger advantage over Formula 1 because it uses a time-resolved beam/diffuse split instead of the fixed global-radiation approximation used by Formula 1.
Limitations#
The current implementation has the following limitations:
only fixed-mounted arrays are supported for reverse transposition;
only the
in_global-only model strategy is implemented;DNI-only input is not sufficient for full tilted irradiance conversion;
model quality depends on sensor orientation metadata;
high-AOI conditions can produce poor reverse-transposition results;
pvlib may emit convergence warnings for some timestamps;
AOI and irradiance validity limits are currently used in validation, but not applied as hard output masks.
References#
The implementation is based on pvlib’s irradiance modeling functions:
Relevant literature:
Marion, B. (2015). A model for deriving the direct normal and diffuse horizontal irradiance from the global tilted irradiance. Solar Energy 122, 1037-1046. DOI: 10.1016/j.solener.2015.10.024.
Driesse, A., Jensen, A. R., and Perez, R. (2024). A continuous form of the Perez diffuse sky model for forward and reverse transposition. Solar Energy 267. DOI: 10.1016/j.solener.2023.112093.