3D Shade Calculator for Large Arrays

5 posts / 0 new
Last post
Paul Gilman
3D Shade Calculator for Large Arrays

For a large, 10 acre, non-rectangular fixed-tilt pv field surrounded by a perimeter of trees, what would be the best way to calculate shading? I assume self shading can be calculated in addition to that which comes from the 3D shade calculator, so my average spacing between rows can be used for self shadingI

We designed the 3D Shade Calculator with small rooftop systems in mind rather than large arrays. However, I think you could use the calculator to esimate the effect of the tree shadows, and then use the self-shading option in SAM itself to estimate the effect of shading between rows. One approach to doing that would be to model the array in SAM as a single subarray with the appropriate numbers of modules per string and strings in parallel on the System Design page, and enable self shading with the appropriate numbers of modules along side and bottom of row on the Shading and Snow page. Then, in the 3D Shade Calculator, create a large horizontal, rectangular active surface to represent the entire array with tree shading objects around the perimeter. The calculator will then calculate the reduction in beam and diffuse irradiance on the entire array caused by the tree shadows.

For shading from the trees, I'm having trouble figuring out how to divide the field up and model it using the 3d shade calculator. I can't seem to make a subarray equal to more than 1 inverters worth of strings. Based on my error messages, each active surface in the 3d shade calculator seems to be associated to one string; that would be devastating, as I have >500 strings. How do I best represent the whole field? 

The 3D Shade Calculator calculates a set of shading losses that it applies to the beam and diffuse incident irradiance. It models the effect of shadows on the array as a reduction in the incident irradiance. It does model the array's electrical response to the shadows, which would depend on how strings are wired. SAM does not do the kind of detailed electrical modeling that would be required to represent those effects.

Finally, if my field is mostly flat but each individual module has tilt, is it appropriate for my active surface to have zero tilt, or does it need to have the same tilt that each individual module has?

If you use the approach I describe above, then it is appropriate to represent the array as a large, rectangular, horizontal active surface for the purpose of the 3D shade calculator's calculation of the reduction in incident irradiance. That will result in an estimate of the effect of shading, but it will reflect the time of day that shadows impact the array's performance.


That's very informative, Paul. Thanks! To support this type of use of the shading calculator, I'd like to suggest that the development team think about implementing polygon active surfaces, in addition to the rectangular ones currently offered.


To be clear, even though SAM says my active surface is for 1 string, the beam irradiance shading loss factors are being applied to every string in my subarray, correct?

Paul Gilman

Thank you for the suggestion to add a polygon option to the 3D Shade Calculator active surface shapes. The calculator does allow you to create both rectangular and triangular active surfaces. By assigning the same subarray number to different active surfaces with different shapes, you could, with some effort, create a subarray with an irregular shape.

You can see how SAM is applying shading losses from the 3D shade calculator to the subarrays in SAM on SAM's Shading and Snow input page. For each subarray in your system, click Edit Shading, and you should see the shading losses in the table under "Enable beam irradiance shading losses by time step." When you run the calculator, it populates this table with shading loss data. If the table as a single column for String 1, then SAM applys those losses to the incident irradiance for the entire subarray. If the table has more than one column, then it uses the method you choose (database lookup, average of strings, etc.) to convert the string losses for each time step to a single loss for the entire subarray.

Best regards,


I'm so glad this thread exists. I was just having similar issues and questions. Thanks for the great work NREL (and Paul)!

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer