Four Quiet Ways the IS 875 Wind Load Goes Wrong on a Solar Array
The wind-load calculation almost never fails an audit. It fails the structure. IS 875 (Part 3) is a sound loading code, and the arithmetic in most reports is right. What moves the answer is a handful of small choices in how the code gets applied, and on a light tilted array those small moves decide which members are under-built. Here is the chain done properly, and the four places it usually slips.
Read the full article below for the methodology, the data, and the engineering decisions behind it.
This article is about the static check, the one every office runs. Getting it right is the floor, not the ceiling. (Whether a flexible array can become dynamically unstable below the code design wind is a separate question, and we have written about that one separately.) What follows is the calculation chain as our in-house IS 875 calculator works through it, with a stop at each of the four points where it most often goes wrong.
1. The pressure chain, factor by factor
The design pressure comes from a short chain. The site wind speed is scaled by the probability, terrain-and-height, topography and importance factors, Vz = Vb·k1·k2·k3·k4 (Cl 6.3). This converts to a velocity pressure pz = 0.6·Vz² (Cl 7.2). The design pressure then folds in the directionality, area-averaging and combination factors, pd = pz·Kd·Ka·Kc.

The pressure chain in the calculator. The factor most often mishandled is Ka, and the one most often misused is Kc.
Two factors carry most of the error. Ka is the area-averaging factor, and Table 4 gives it as three points by tributary area: 1.0 up to 10 m², 0.9 at 25 m², and 0.8 at 100 m² and above. Many spreadsheets fit a single logarithmic line through these points. It reads close enough in the middle, but the fit drifts at the ends, and a careless version returns values below 0.8 or above 1.0, neither of which Table 4 intends. The correct approach is to read the three points and interpolate between them.
Kc is the combination factor, and its value is 1.0 unless wind genuinely acts on more than one surface at the same time. Setting Kc to 0.9 to stay on the safe side is not conservative at all. It removes ten percent from every load with no physical basis. For a single canopy-type surface, it should remain 1.0. The local edge zones are a separate matter: there Kd = Ka = Kc = 1.0 (Cl 7.2.1 note), so the connections see the full pz and not the reduced array pressure.
2. The coefficient problem: borrowing Table 8
Here is a point the code does not state openly. IS 875 does not provide pressure coefficients measured for a tilted, free-standing row of PV modules sitting a metre above the ground, with further rows in front and behind. So designers borrow. The common choice is Table 8, the monoslope free-roof (canopy) values, and as a starting point that is reasonable. It comes with two conditions that are usually skipped.

Table 8, transcribed in full. Maximum (download) and minimum (uplift) are different surfaces of the same table and govern different members.
First, interpolate to the actual tilt. The table is on a 5° grid. A 12° array is not a 10° array, and rounding to the nearest row discards load on the uplift side, where the curve is steepest. Second, keep the maximum and minimum sets separate. The maximum (largest positive) coefficients drive the download case, and the minimum (largest negative) drive uplift. These are not one number with a sign, they are two design conditions, and the member that governs under download is seldom the one that governs under uplift. The local-zone coefficients in the same table are much larger than the overall ones, and that is intentional: they belong to cladding and fixings, not to member bending.
Worth stating plainly: borrowing canopy coefficients is an approximation. For a critical or unusual layout, the proper cross-check is a solar-specific source (ASCE 7 Ch. 29 or SEAOC PV2), or a wind tunnel, or CFD. The calculator flags this assumption rather than hiding it.
3. The 0.30W trap: the purlins are not equally loaded
Table 8 carries a note that almost everyone reads and almost no one applies. The centre of pressure of the net load sits at 0.30W from the windward edge, not at mid-width. The load is front-heavy.

The load resultant sits forward, towards the windward edge, and a wind reversal swaps which edge that is.
Translate this to purlins running across the slope, and the result is concrete. With four purlins, the windward purlin carries about 1.9 times the mean line load and the leeward one about 0.1 times. Spread the same total pressure equally across four purlins, and the windward purlin is under-designed by nearly a factor of two. The image below shows the factors the calculator applies.

Per-purlin factors from the 0.30W distribution. The windward purlin is the one to watch.
Then the wind reverses. When it arrives from the low edge, the high edge becomes the windward edge and the whole distribution flips. The purlin that was carrying 0.1 now carries 1.9. Both outer purlins therefore have to be sized for the peak, which is why the calculator builds the envelope over both wind directions before it gives you a design load.
A closer look: what 0.30w actually fixes
The 0.30w note is one of the most misread lines in the code, so it is worth slowing down on. It is widely taken to prescribe a single, fixed load pattern. It does not.
Table 8's note fixes two quantities and no more: the total net force on the canopy, and the position of that force's resultant, which it places at 0.30w from the windward edge. It is silent on the shape of the pressure between those two constraints. More than one distribution satisfies both, and the two in common use give different purlin loads.
The first is a zone-wise model. Treat the windward half as a uniform pressure α and the leeward half as a uniform pressure β. Force conservation gives α + β = 2, and placing the resultant at 0.30w gives α + 3β = 2.4. Solving the two, α = 1.8 and β = 0.2, so every purlin in the windward half carries 1.8 times the mean and every purlin in the leeward half 0.2 times. The second is a linear gradient. The pressure ramps across the width and is read off at each purlin position. For four evenly spaced purlins that gives 1.9, 1.3, 0.7 and 0.1.
Both conserve the total force, and both put the continuous resultant at 0.30w. Neither is wrong against the code. They distribute the same total differently across the purlins, and that is the whole of the disagreement.
Purlin (4, even) | Gradient, one direction | Gradient, reversal envelope | Zone, one direction | Zone, reversal envelope |
|---|---|---|---|---|
P1 (windward) | 1.9 | 1.9 | 1.8 | 1.8 |
P2 | 1.3 | 1.3 | 1.8 | 1.8 |
P3 | 0.7 | 1.3 | 0.2 | 1.8 |
P4 (leeward) | 0.1 | 1.9 | 0.2 | 1.8 |
Resolved column moment | — | 17.3 kN·m | — | 18.4 kN·m |
Two consequences are worth holding on to. Under the reversal envelope the zone model sends every purlin to 1.8, because each purlin lies in the windward half for one of the two wind directions, while the gradient keeps the inner purlins lighter. And for the resolved column moment the zone model is marginally the more conservative, because its discrete resultant lands at exactly 0.30w, a little further from a central column. The gradient, for its part, preserves the windward-edge peak that governs the windward purlin itself.
So the practical position is to pick the distribution that is conservative for the action being checked, and to record which one was used. For the extreme windward member the gradient is the sharper check; for global force and overturning the zone halves are clean and slightly conservative. The calculator carries both as a switch, and it scales the purlin table to the actual number of purlins, up to eight, so a landscape layout with several modules up the slope is handled directly rather than forced into a four-purlin template.


4. The frame load path: reactions by geometry, not equal-split
This is the one that hides best, because the work looks finished after step three. You have the purlin reactions. They now have to travel down through the support frame, and the common habit is to split the total vertical load equally between the supports. The same 0.30W front-loading makes that wrong.

Reactions resolved on a single-leg (Y) frame. The column moment is the action an equal-split never reports.
On a single-leg (Y) frame, the load resultant is eccentric to the central column, so the column picks up a bending moment. In the worked example it is about 20 kN of axial together with 17.3 kN·m of moment, and that moment is not a rounding effect, it is the dominant action on the column. An equal-split reaction reports zero moment there and sends a column to site that bends in service. The braces tell the same story: the front (windward) brace carries about 25 kN while the rear carries 3.6 kN. If both are sized the same, steel is wasted on one and the other is under-built. A dual-leg frame behaves in the same way, sending far more reaction to the windward column than to the leeward one. The reactions have to be resolved from the geometry of the frame and the position of the load, every time.
From loads to the model
The end product is a schedule of characteristic loads: the purlin member UDLs, the local connection load, the direct wind on the frame members, the frame reactions for whichever topology is in use, and the anchorage demands. Characteristic means unfactored. The load factors and combinations are applied in the analysis, and on a solar structure the case that usually governs is the one that is most often forgotten, 0.9 times dead load against uplift, for overturning and pull-out.

One schedule, both wind directions, every member and anchor. Nothing is dropped between the wind calculation and the model.
A word on the tools most teams already use. The standard wind-load generators in structural software state it openly: the dynamic effect of wind is not considered. For a stiff, heavy building this is acceptable. For a light array it means the generator gives you a static pressure and stops there. Keeping the load chain in a calculator you can read and check line by line is the difference between a number you can defend and a number you have simply inherited.
The four, in one place
Where it goes wrong | The correct approach |
|---|---|
Ka fitted as a single logarithmic line | Read Table 4 as three points, interpolate between them, and stay within 0.8 to 1.0 |
Kc dropped to 0.9 by default | Keep Kc = 1.0 for a single surface; local zones at full pressure |
Purlins loaded equally | Apply the 0.30W distribution; envelope both wind directions on the outer purlins |
Frame reactions split equally | Resolve from the geometry; capture the column moment and the front-heavy brace split |
Where Shirsh fits
None of this makes IS 875 a poor code. It makes the static check a floor that has to be reached before anything else is worth discussing. Getting these four right is the difference between a wind-load basis that survives a reviewer and one that survives the wind. Where the layout is unusual, the rows are long, or the structure is light and flexible enough that the static answer is no longer the complete answer, we take it further with CFD and fluid-structure interaction. If you would like a wind-load basis for a solar structure that you can put your name to, please do get in touch with us.
Shirsh TechnoSolutions provides FEA, CFD and fluid-structure interaction consultancy for structural and energy engineering. For solar mounting-structure wind loading, tracker aeroelastic assessment and frame design, please get in touch.
Click to view full size
Want to Apply This to Your Product?
Our engineers can help you implement these techniques on your specific components and assemblies.
Get insights like this in your inbox
Engineering deep-dives, simulation tips, and industry analysis. No spam, unsubscribe any time.
