Skip to main content

Summary

This model calculates row-to-row shading using geometric algorithms for arrays on uniform terrain. PlantPredict implements two variants: a simple trigonometric model for flat terrain, and a slope-aware vector-based model that handles uniform slopes and accounts for bay-to-bay shading within rows. Both methods provide fast calculations suitable for regular array layouts.

Inputs

NameSymbolUnitsDescription
Collector Width\ellmTracker bay width perpendicular to rotation axis
Row PitchppmHorizontal distance between tracker rotation axes
Row LengthLLmLength of array row parallel to axis
Number of RowsNNTotal rows in array block
Bay LengthLbL_bmLength of individual bay within row
Bay Spacingsbs_bmGap between adjacent bays along row
Bays Per RowNbN_bNumber of bays in each row
Row Tilt Angleβ\betadegreesTilt angle of module from horizontal
Row Azimuth Angleγ\gammadegreesAzimuth angle of module surface normal, measured clockwise from North
Solar Zenith Angleθz\theta_zdegreesAngle between sun and vertical
Solar Azimuth Angleγs\gamma_sdegreessun azimuth, measured clockwise from North
Ground Slopeβg\beta_gdegreesTerrain slope angle
Ground Slope Azimuthγg\gamma_gdegreesDownhill direction of slope, measured clockwise from North

Outputs

NameSymbolUnitsDescription
Beam Shading FactorUshd,BU_{shd,B}Fraction of beam irradiance reaching modules (0-1)

Detailed Description

Algorithm Selection

Version 11+:
  • Tracker systems: Always uses slope-aware model (even on flat terrain)
  • Fixed tilt: Row-to-row trigonometric model if flat terrain (both slopes = 0) and “Infinite Length Rows” algorithm selected; slope-aware otherwise
Version 8-10:
  • Row-to-row trigonometric model if: flat terrain (both slopes = 0) and “Infinite Length Rows” algorithm selected
  • Slope-aware otherwise (sloped terrain or “Infinite Length Rows” not selected)
Version 7 and earlier:
  • Row-to-row trigonometric model if flat terrain (both slopes = 0)
  • Slope-aware if sloped terrain ( or ≠ 0)

Row-to-Row Trigonometric Model

The algorithm calculates the relative height and length of shadows cast by the directly adjacent row to determine the shaded fraction on interior rows, then adjusts for edge effects in finite arrays. This model operates at the row level, treating each row as continuous (omitting spacing between ), and only considers shadows from the row immediately in front. It does not account for diagonal, second-row, or along-axis bay-to-bay shading.

Shaded Fractions

Shaded height fraction (relative height of shadow from adjacent row, 0-1): hs=1p[cos(β)+sin(β)cos(γsγ)tan(θz)]h_s = 1 - \frac{p}{\ell[\cos(\beta) + \sin(\beta) \cos(\gamma_s - \gamma) \tan(\theta_z)]} Shaded length fraction (relative length of shadow from adjacent row, 0-1): ls=1psin(β)sin(γsγ)tan(θz)L[cos(β)+sin(β)cos(γsγ)tan(θz)]l_s = 1 - \frac{p\sin(\beta) |\sin(\gamma_s - \gamma)| \tan(\theta_z)}{L[\cos(\beta) + \sin(\beta) \cos(\gamma_s - \gamma) \tan(\theta_z)]} If hsh_s or lsl_s fall outside [0,1], they are set to 0. For “Infinite Length Rows” mode, lsl_s is set to 1.

Beam Shading Factor

Ushd,B=1hs×ls×N1NU_{shd,B} = 1 - h_s \times l_s \times \frac{N - 1}{N} The factor (N1)/N(N - 1) / N accounts for the first row being unshaded. If the is 90°\geq 90° (sun behind modules), shading is not applied.

Slope-Aware Linear Shading

This algorithm uses a vector-based approach with that projects shadows from multiple neighboring bays onto each receiver module. The terrain slope is decomposed into cross-axis (perpendicular to rows) and along-axis (parallel to rows) components to determine bay elevations and shadow geometry. Special cases handle array edges where fewer neighbor candidates exist.

Step 1: Shading Candidates Identification

For each receiver bay, the algorithm considers shadows from up to 6 neighboring bays. The sun’s azimuth position relative to the row orientation determines which side’s diagonal bays to evaluate, while the along-axis slope determines the elevation differences that affect whether those bays can actually cast shadows:
  1. Adjacent bay along row (same row, 1 position along-axis)
  2. Row directly in front (1 row cross-axis, centered)
  3. Diagonal bay (1 row cross-axis, 1 position along-axis)
  4. Diagonal bay (2 rows cross-axis, 1 position along-axis)
  5. Diagonal bay (1 row cross-axis, 2 positions along-axis)
  6. Diagonal bay (1 row cross-axis, 3 positions along-axis)

Step 2: Shadow Projection via Polygon Clipping

For each shadow source:
  1. Project the shading candidate bay’s vertices along the sun’s direction onto the receiver plane
  2. Compute the intersection polygon between the projected shadow and receiver bay boundaries
  3. Calculate the intersection polygon area
This 3D vector geometry accounts for module tilt, tracker rotation, and terrain slopes.

Step 3: Shadow Overlap Calculation

Multiple shadows can overlap on a single receiver. The total shaded area uses the inclusion-exclusion principle to avoid double-counting: Ashade=iAii<jAij+i<j<kAijki<j<k<lAijkl+A_{shade} = \sum_i A_i - \sum_{i<j} A_{ij} + \sum_{i<j<k} A_{ijk} - \sum_{i<j<k<l} A_{ijkl} + \ldots where AiA_i is the area of shadow ii, AijA_{ij} is the overlapping area of shadows ii and jj, etc.

Step 4: Beam Shading Factor

The unshaded fraction for each bay position is: Ushd,B=1AshadeAmoduleU_{shd,B} = 1 - \frac{A_{shade}}{A_{module}} Edge effects: The list of shadow candidates is reduced for bays at the edges of the array:
  • Front row bays: Only along-axis shade from adjacent bays within the same row (no shading from rows in front)
  • Second row bays: No second-row diagonal shading candidates
  • End bays (1st, 2nd, 3rd from edges): Progressively fewer along-axis and diagonal shading candidates
The array-averaged shading factor is a weighted sum over all bay positions, accounting for the specific shading candidates available to each position in the array.