Structural Design Example - Four Span Metal Building Z-Purlin Line Supporting a Standing Seam Roof

Introduction

This example provides a step-by-step strength calculation of a 4-span continuous Z-purlin system supporting a standing seam roof.

Design inputs are defined first, including cross-section dimensions and orientation, span lengths, roof slope, and bracing provided by the standing seam to the purlin line. The calculations consider gravity (downward) and suction (uplift) loadings.

Acknowledgements

The development of this notebook was financially supported by the American Iron and Steel Institute. Thank you to the task group members who offered thoughtful comments along the way.

How to use this notebook

This is a live calculation notebook. You can make a copy of it by pressing the 'Remix' button at the upper right corner of this browser window. Once you have the notebook copied to your Nextjournal account, you can run the calculation by clicking on the 'Double Arrows' at the top-left part of this browser window to the right of the Nextjournal logo.

Source code

The software package StructuresKit.jl performs most of the structural analysis and design in this example. It is written in the Julia computing language. Plots.jl is uses to make all the plots.

#load StructuresKit.jl from Github, use AISI2020webinar branch as suggested by Helen
pkg"add https://github.com/runtosolve/StructuresKit.jl#AISI2020webinar";
66.0s
Julia
using StructuresKit  #start up the package so we can run its functions
324.1s
Julia
using Plots  #start up the package so we can run its functions
113.3s
Julia

Design specification

Purlin line capacity is calculated with the AISI S100-16 North American Specification for the Design of Cold-Formed Steel Structural Members.

Allowable Stress Design (ASD)

Allowable Stress Design (ASD) is used to calculate the purlin line failure pressures.

ASDorLRFD=0;    #ASDorLRFD=0 for ASD, =1 for LRFD
0.2s
Julia

Units

Consistent units of kips and inches and degrees are used for inputs. Output units are labeled.

Roof system definitions and inputs

Purlin span geometry

The standing seam roof is supported by continuous span Z-purlin lines with a typical center-to-center span length of 25 ft. The exterior spans are 8ZS2.25x070 purlins, and the interior spans are 8ZS2.25x059 purlins. The purlins overhang the end supports by 1 ft., and they are spliced at supports with the dimensions provided in Figure 1. This span layout is consistent with AISI D100 Cold-Formed Steel Design Manual Example II-2A.

#The purlin line are discretized on grid.
#Each row defines one segment of the beam span from left to right.
#L dL SectionProperties MaterialProperties LoadLocation BracingProperties CrossSectionDimensions
#L is the length of each beam segment
#each beam segment is split into subsegments of length dL 
  MemberDefinitions = [(1.0*12,2.0,    1,1,1,1,1),
                        (22.5*12,6.0,   1,1,1,1,1),
                        (6.0*12,6.0,    3,1,1,1,3),
                        (20.5*12,6.0,   2,1,2,1,2),
                        (2*12,3.0,      4,1,2,1,4),
                        (20.5*12,6.0,   2,1,2,1,2),
                        (6.0*12,6.0,    3,1,1,1,3),
                        (22.5*12,6.0,   1,1,1,1,1),
                        (1.0*12,2.0,    1,1,1,1,1)];
0.2s
Julia

Roof loading

Gravity and uplift roof pressures are considered.

Purlin spacing

The purlin spacing for this example is 5 ft.

PurlinSpacing=5*12;  #in.
0.2s
Julia

Roof slope

The roof slope inline_formula not implemented=4.76 degrees (1:12), with the purlin flange pointing upslope.

RoofSlope = 4.76;   #degrees
0.2s
Julia

Supports and end boundary conditions

It is assumed that translations and rotations are restrained at every span support and the cantilever ends are free ends.

#location z where u=v=ϕ=0
Supports = [1.0*12 26.0*12 51.0*12 76.0*12 101.0*12];
#end boundary conditions
#type=1 u''=v''=ϕ''=0 (simply supported), type=2 u'=v'=ϕ'=0  (fixed), type=3 u''=v''=ϕ''=u'''=v'''=ϕ'''=0 (free end, e.g., a cantilever)
EndBoundaryConditions = [3 3];
0.3s
Julia

Purlin cross-section properties

There are two purlin cross-sections in the purlin line, 8ZS2.25x070 and 8ZS2.25x059. The centroidal axis moment of inertias about the centroid are inline_formula not implemented and inline_formula not implemented, the product of inertias, inline_formula not implemented, and the warping and St. Venant torsion constants inline_formula not implemented and inline_formula not implemented are taken from AISI D100 Table I-4. The interior and exterior purlin splice section properties are assumed to be the summation of the section properties of the spliced members.

#Each row below defines a set of section properties.  There are 4 rows because there are 4 cross-sections in this example -  8ZS2.25x070, 8ZS2.25x059, 8ZS2.25x070+ 8ZS2.25x059 at a splice, and 8ZS2.25x059+8ZS2.25x059 at a splice.
#Ix Iy Ixy J Cw Wn Mcrℓx Mcrℓy
SectionProperties = [
  (9.18,1.28,-2.47,0.00159,15.1, 151.86, 66.33),
  (7.76,1.08,-2.08,0.000954,12.7, 91.48, 40.06),
  (9.18+7.76,1.28+1.08,-(2.47+2.08),0.00159+0.000954, (15.1+12.7)*2, 151.86+91.48, 66.33+40.06),
  (7.76*2,1.08*2,-2.08*2,0.000954*2,12.7*4, 2*91.48, 2*40.06)];
0.3s
Julia

The unit warping stress Wn is multiplied by 4 in the spliced regions because otherwise the AISI bending+torsion interaction equation predicts failure. More work is needed to determine how to consider bimoment in the design of spliced regions.

Ixy is negative here because the AISI D100 coordinate system has y pointing up however the PlautBeam coordinate system has y pointing down.

The critical elastic buckling moments Mcrlx and Mcrly were calculated with CUFSM. In the future they could be calculated in this notebook (or in an software workflow) using evolving open-source packages like pyCUFSM.

Purlin cross-section dimensions

Cross-section dimensions for each of the 4 cross-sections in this example are needed for calculating distortional buckling capacity and shear capacity.

#t is base metal thickness
#ho, b, d, and h are outside purlin depth, flange width, lip length, and web flat height
#θ is lip angle from the horizontal
#CorZ=0 for C, CorZ=1 for Z
#This nomenclature is consistent with AISI S100-16.
#t, ho, b, d, θ, CorZ, h
CrossSectionDimensions = 
[(0.070, 8.0, 2.25, 0.930, 50, 1, 7.560),
 (0.059, 8.0, 2.25, 0.910, 50, 1, 7.582),
 (0.070+0.059, 8.0, 2.25, 0.910, 50, 1, 7.56),
 (0.059*2, 8.0, 2.25, 0.910, 50, 1, 7.582)];
0.2s
Julia

Distributed load location

The distributed load, inline_formula not implemented, is applied at the center of the top flange. The variables inline_formula not implemented and inline_formula not implemented are the inline_formula not implemented and inline_formula not implemented distances from the shear center to the load application point. The inline_formula not implemented-axis is parallel to the roof and the inline_formula not implemented-axis is perpendicular to the roof.

The angle of the load inline_formula not implemented to the purlin flange varies. For gravity loading inline_formula not implemented is always vertical. For an uplift loading, inline_formula not implemented is always perpendicular to the purlin top flange.

#ax ay
LoadLocation = [((2.250-0.070/2)/2,4), ((2.250-0.059/2)/2,4)];
0.2s
Julia

Purlin material properties

Typical material properties for cold-formed steel are assumed.

#E  ν  Fy
MaterialProperties = [(29500,0.30, 55)];
0.2s
Julia

System bracing details

A standing seam roof with a trapezoidal profile is assumed. The roof is attached to the purlins with low fixed clips at a spacing of 24 in.

The distributed rotational stiffness provided to the purlin by the roof is obtained from clip-panel tests described in Seek and Laughlin (2017) Table A2.1.

The distributed translational stiffness provided to the purlin by the roof is inspired by results from gravity open-web joist tests partially braced by a standing seam roof described in Cronin and Moen (2012).

It is assumed that inline_formula not implemented for gravity loads is twice that of uplift loads because for gravity loads the roof tends to 'hug' the clips.

More work is needed to quantify in-situ standing seam roof clip stiffness.

The roof diaphragm shear stiffness is assumed to be much higher than the lateral clip stiffness and therefore only the clip stiffnesses affect the purlin deformations in this example. A springs-in-series model could be constructed using recent research to study the impact of the roof diaphragm on purlin design.

#kx  kϕ  Lm  a
#kx has units of kips/in./in., and kϕ of kips-in./rad/in.
#Lm is the spacing between bracing that restrains distortional buckling
#a is the web shear stiffener spacing, assumed equal to the span length here since none are provided
BracingProperties = [(0.100,0.100, 25.0*12, 25.0*12)];
0.1s
Julia

The bracing properties above are for the gravity load case. They will be updated later in the example for the uplift case.

With all inputs defined, we can now calculate standing seam roof system capacity.

Roof capacity under gravity loading

Deflections

When the standing seam roof carries a downward gravity pressure, downward forces are applied to the center of the purlin top flange at the clips as shown in Figure 6 which creates bending and twist deformations. Let's review these deformations for a gravity roof pressure of 10 psf. They are calculated with elastic second order analysis using the Plaut and Moen (2020) formulation.

#Solve for the purlin line deformations
#10 psf pressure 
Pressure=10/1000/144  #kips/in.^2
q=Pressure*PurlinSpacing*cos(deg2rad(RoofSlope))  #cosine here for slope
qx = -q*sin(deg2rad(RoofSlope))
qy = q*cos(deg2rad(RoofSlope))
UniformLoad=(qx,qy)
z, u, v, ϕ, beamProperties = PlautBeam.solve(MemberDefinitions, SectionProperties, MaterialProperties, LoadLocation, BracingProperties, EndBoundaryConditions, Supports, UniformLoad);
24.3s
Julia
plot(z/12,u, legend=false, markershape= :circle)
ylabel!("u [in.]")
xlabel!("z [ft.]")
32.1s
Julia
plot(z/12,v, legend=false)
ylabel!("v [in.]")
xlabel!("z [ft.]")
0.7s
Julia
plot(z/12,rad2deg.(ϕ), legend=false)
ylabel!("phi [degrees]")
xlabel!("z [ft.]")
0.6s
Julia

Demand moments, shear and torsion

The moments about the cross-section centroidal axes, torsion, bimoment, and shear on the centroidal axes can be calculated from these deformations.

Mxx = InternalForces.moment(z, beamProperties.dm, -v, beamProperties.E, beamProperties.Ix);
Myy = InternalForces.moment(z, beamProperties.dm, -u, beamProperties.E, beamProperties.Iy);
Vyy = InternalForces.shear(z, beamProperties.dm, -v, beamProperties.E, beamProperties.Ix);
Vxx = InternalForces.shear(z, beamProperties.dm, -u, beamProperties.E, beamProperties.Iy);
T = InternalForces.torsion(z, beamProperties.dm, ϕ, beamProperties.E, beamProperties.G, beamProperties.J, beamProperties.Cw);
B = InternalForces.bimoment(z, beamProperties.dm, ϕ, beamProperties.E, beamProperties.Cw);
2.0s
Julia

Positive moments, shear and torsion follow the nomenclature in the figure below.

plot(z/12,Mxx, legend=false)
ylabel!("Mxx [kip-in.]")
xlabel!("z [ft.]")
0.4s
Julia
plot(z/12,Vyy, legend=false)
ylabel!("Vyy [kips]")
xlabel!("z [ft.]")
0.5s
Julia
plot(z/12,Myy, legend=false)
ylabel!("Myy [kip-in.]")
xlabel!("z [ft.]")
0.4s
Julia
plot(z/12,Vxx, legend=false)
ylabel!("Vxx [kips]")
xlabel!("z [ft.]")
0.5s
Julia
plot(z/12,T, legend=false)
ylabel!("T [kip-in.]")
xlabel!("z [ft.]")
0.4s
Julia
plot(z/12,B, legend=false)
ylabel!("B [kip-in.^2]")
xlabel!("z [ft.]")
0.5s
Julia

Purlin strength limit state checks

The expected strength of the purlin line is defined when one of 4 strength limit states are violated along the spans: (1) distortional buckling, (2) bending+torsion interaction, (3) biaxial bending, or (4) bending+shear. The checks are performed with elastic demand shears, moments and torsion considering second order effects and connection stiffness as specified in AISI S100-16 Section C1 "Design for System Stability".

  1. The distortional buckling capacity is calculated with AISI S100-16 Eq. F4.1-1, where the critical elastic distortional buckling stress inline_formula not implemented is obtained using AISI S100-16 Appendix 2, Eq. 2.3.3.3-1 assuming the standing seam clips do not provide rotational restraint, i.e., inline_formula not implemented in Eq. 2.3.3.3-1. The distance between discrete restraints that restrain distortional bucking is defined as the span length, i.e., inline_formula not implemented=25 ft. in Section 7.8 above. Since inline_formula not implemented is calculate about the x- axis, the demand that it is compared to is inline_formula not implemented when defining failure.

  2. The bending+torsion interaction check is defined in AISI S100-24 Eq. H4.2-1:

    formula not implemented

    The demand moments inline_formula not implemented and inline_formula not implemented with trends consistent with those in Section 8.2. The expected local buckling strengths are calculated with AISI S100-16 Section F.3.2.1 where inline_formula not implemented and inline_formula not implemented. The critical elastic local buckling moments inline_formula not implemented and inline_formula not implemented are calculated with CUFSM and defined in Section 7.6.

    The demand bimoment is inline_formula not implemented (again see Section 8.2) and inline_formula not implemented is calculated with AISI S100-24 Eq. H4.1-1:

    formula not implemented

    where inline_formula not implemented is the maximum magnitude of cross-section unit warping calculated in CUFSM and defined in Section 7.4 and inline_formula not implemented.

  3. The biaxial bending strength limit state is checked with AISI S100-16 Eq. H1.2-1.

  4. The bending+shear strength limit state is evaluated with AISI S100-16 Eq. H2-1.

Other interaction checks could be considered here instead of those listed above. For example, Prof. Seek's recent work on calculating stresses on the cross-section including flexure and torsion and applying the Direct Strength Method are in play.

Global buckling as defined in the Direct Strength Method is considered in the second-order analysis and interaction checks, not with a critical elastic buckling load. So here there is no inline_formula not implemented calculated for gravity loads, or for the uplift load case next.

Purlin line capacity under gravity loading

Failure in the purlin line is calculated by increasing the roof pressure until one of the strength limit states is violated.

GravityOrUplift=0   #GravityOrUplift=0 for gravity loading
eqn, z, strengths, forces, interactions, dc = PurlinDesigner.lineStrength(ASDorLRFD, GravityOrUplift, MemberDefinitions, SectionProperties, CrossSectionDimensions, MaterialProperties, LoadLocation, BracingProperties, RoofSlope, EndBoundaryConditions, Supports)
FailurePressure=eqn/(PurlinSpacing*cos(deg2rad(RoofSlope)))*1000*144
println("ASD expected gravity roof capacity = ",round(FailurePressure,digits=1), " psf")
31.0s
Julia
plot(z/12,dc.dist, legend=false)
plot!([0, 102],[1.0, 1.0], linecolor=:red, linewidth=2)
ylabel!("Distortional buckling demand/capacity ratio")
xlabel!("z [ft.]")
ylims!((0,1.41))
xlims!((0,102))
3.6s
Julia
plot(z/12,interactions.BTTotal, label="Interaction")
plot!(z/12, interactions.BTMxx, label="ActionMxx")
plot!(z/12, interactions.BTMyy, label="ActionMyy")
plot!(z/12, interactions.BTB, label="ActionB")
plot!([0, 102],[1.15, 1.15], label="Limit", linecolor=:red, linewidth=2)
ylabel!("Flexure+torsion interaction")
xlabel!("z [ft.]")
ylims!((0,1.41))
xlims!((0,102))
1.2s
Julia
plot(z/12,interactions.BBTotal, label="Interaction")
plot!(z/12, interactions.BBMxx, label="ActionMxx")
plot!(z/12, interactions.BBMyy, label="ActionMyy")
plot!([0, 102],[1.0, 1.0], label="Limit", linecolor=:red, linewidth=2)
ylabel!("Biaxial bending")
xlabel!("z [ft.]")
ylims!((0,1.41))
xlims!((0,102))
0.5s
Julia
plot(z/12,dc.MV, legend=false)
plot!([0, 102],[1.0, 1.0], linecolor=:red, linewidth=2)
ylabel!("Shear+flexure demand/capacity ratio")
xlabel!("z [ft.]")
ylims!((0,1.41))
xlims!((0,102))
0.4s
Julia

Purlin line capacity trends under gravity loading

The purlin line failure pressure under gravity loading is calculated with varying lateral and rotational bracing stiffness to show its influence on failure pressure.

kx=[0.0:0.02:0.1;0.15:0.05:1.0]
=0.0:0.05:0.1
eqn=zeros(length(kx),length())
for i in eachindex(kx)
    for j in eachindex()
        BracingProperties=[(kx[i],[j],25.0*12, 25.0*12)]
    
        eqn[i,j], z, strengths, forces, interactions, dc =                 PurlinDesigner.lineStrength(ASDorLRFD, GravityOrUplift, MemberDefinitions,       SectionProperties, CrossSectionDimensions, MaterialProperties, LoadLocation,     BracingProperties, RoofSlope, EndBoundaryConditions, Supports)
    end
end
1512.2s
Julia
FailurePressure=eqn./(PurlinSpacing.*cos.(deg2rad(RoofSlope))) .*1000 .*144;
0.4s
Julia
plot(kx,FailurePressure[:,1],  markershape=:circle, label="kphi=0.0")
plot!(kx,FailurePressure[:,2], markershape=:square, label="kphi=0.05")
plot!(kx,FailurePressure[:,3], markershape=:diamond, label="kphi=0.10")
ylabel!("ASD expected gravity roof capacity [psf]")
xlabel!("kx [kips/in./in.]")
0.7s
Julia

Another interesting study is to vary the roof slope and observe its effect on purlin line strength.

BracingProperties=[(0.100,0.100,25.0*12, 25.0*12)]
RoofSlope=rad2deg.(atan.(0.0:(0.5/12):(4/12)))
eqn=zeros(length(RoofSlope))
for i in eachindex(RoofSlope)
          eqn[i], z, strengths, forces, interactions, dc =                 PurlinDesigner.lineStrength(ASDorLRFD, GravityOrUplift, MemberDefinitions,       SectionProperties, CrossSectionDimensions, MaterialProperties, LoadLocation,     BracingProperties, RoofSlope[i], EndBoundaryConditions, Supports)
end
223.3s
Julia
FailurePressure=eqn./(PurlinSpacing.*cos.(deg2rad.(RoofSlope))) .*1000 .*144;
0.3s
Julia
plot(RoofSlope, FailurePressure,  markershape=:circle, legend=false)
ylabel!("ASD expected gravity roof capacity [psf]")
xlabel!("Roof slope [degrees]")
ylims!((0,25))
1.7s
Julia

Roof capacity under uplift loading

Deflections

When the standing seam roof carries an uplift pressure, clip forces normal to the roof face are applied to the center of the purlin top flange which creates bending and twist deformations that are different than the gravity loading. Let's review these deformations for an uplift roof pressure of -10 psf.

RoofSlope=0.0   #this sets the load perpendicular to the roof for uplift loading
#reduce kx by half for uplift loading, no hugging
BracingProperties = [(0.100/2,0.100, 25.0*12, 25.0*12)];
#Solve for the purlin line deformations
#-10 psf pressure load
Pressure=-10/1000/144  #kips/in.^2
q=Pressure*PurlinSpacing
qx = -q*sin(deg2rad(RoofSlope))
qy = q*cos(deg2rad(RoofSlope))
UniformLoad=(qx,qy)
z, u, v, ϕ, beamProperties = PlautBeam.solve(MemberDefinitions, SectionProperties, MaterialProperties, LoadLocation, BracingProperties, EndBoundaryConditions, Supports, UniformLoad);
2.9s
Julia
plot(z/12,u, legend=false)
ylabel!("u [in.]")
xlabel!("z [ft.]")
0.4s
Julia
plot(z/12,v, legend=false)
ylabel!("v [in.]")
xlabel!("z [ft.]")
0.4s
Julia
plot(z/12,rad2deg.(ϕ), legend=false)
ylabel!("phi [degrees]")
xlabel!("z [ft.]")
0.4s
Julia

Demand moments and torsion

The moments about the cross-section centroidal axes, torsion, bimoment, and shear on the centroidal axes can be calculated from these deformations.

Mxx = InternalForces.moment(z, beamProperties.dm, -v, beamProperties.E, beamProperties.Ix);
Myy = InternalForces.moment(z, beamProperties.dm, -u, beamProperties.E, beamProperties.Iy);
Vyy = InternalForces.shear(z, beamProperties.dm, -v, beamProperties.E, beamProperties.Ix);
Vxx = InternalForces.shear(z, beamProperties.dm, -u, beamProperties.E, beamProperties.Iy);
T = InternalForces.torsion(z, beamProperties.dm, ϕ, beamProperties.E, beamProperties.G, beamProperties.J, beamProperties.Cw);
B = InternalForces.bimoment(z, beamProperties.dm, ϕ, beamProperties.E, beamProperties.Cw);
0.2s
Julia
plot(z/12,Mxx, legend=false)
ylabel!("Mxx [kip-in.]")
xlabel!("z [ft.]")
0.5s
Julia
plot(z/12,Vyy, legend=false)
ylabel!("Vyy [kips]")
xlabel!("z [ft.]")
0.5s
Julia
plot(z/12,Myy, legend=false)
ylabel!("Myy [kip-in.]")
xlabel!("z [ft.]")
0.4s
Julia
plot(z/12,Vxx, legend=false)
ylabel!("Vxx [kips]")
xlabel!("z [ft.]")
0.5s
Julia
plot(z/12,T, legend=false)
ylabel!("T [kip-in.]")
xlabel!("z [ft.]")
0.5s
Julia
plot(z/12,B, legend=false)
ylabel!("B [kip-in.^2]")
xlabel!("z [ft.]")
0.4s
Julia

Purlin strength limit state checks

In the same way as for gravity pressures (see Section 8.3), failure in the purlin line is assumed to occur at the location where the demand loads first exceed the distortional buckling capacity or violate the bending+torsion interaction check, a biaxial bending check, or a shear+moment interaction check.

Purlin line capacity under uplift loading

Failure in the purlin line is calculated by increasing the roof pressure until a limit state is violated.

GravityOrUplift=1   #GravityOrUplift=1 for uplift loading
eqn, z, strengths, forces, interactions, dc = PurlinDesigner.lineStrength(ASDorLRFD, GravityOrUplift, MemberDefinitions, SectionProperties, CrossSectionDimensions, MaterialProperties, LoadLocation, BracingProperties, RoofSlope, EndBoundaryConditions, Supports)
FailurePressure=eqn/PurlinSpacing*1000*144
println("ASD expected uplift roof capacity = ",round(FailurePressure,digits=1), " psf")
25.7s
Julia
plot(z/12,dc.dist, legend=false)
plot!([0, 102],[1.0, 1.0], linecolor=:red, linewidth=2)
ylabel!("Distortional buckling demand/capacity ratio")
xlabel!("z [ft.]")
ylims!((0,1.41))
xlims!((0,102))
0.5s
Julia
plot(z/12,interactions.BTTotal, label="Interaction")
plot!(z/12, interactions.BTMxx, label="ActionMxx")
plot!(z/12, interactions.BTMyy, label="ActionMyy")
plot!(z/12, interactions.BTB, label="ActionB")
plot!([0, 102],[1.15, 1.15], label="Limit", linecolor=:red, linewidth=2)
ylabel!("Flexure+torsion interaction")
xlabel!("z [ft.]")
ylims!((0,1.41))
xlims!((0,102))
0.4s
Julia
plot(z/12,interactions.BBTotal, label="Interaction")
plot!(z/12, interactions.BBMxx, label="ActionMxx")
plot!(z/12, interactions.BBMyy, label="ActionMyy")
plot!([0, 102],[1.0, 1.0], label="Limit", linecolor=:red, linewidth=2)
ylabel!("Biaxial bending")
xlabel!("z [ft.]")
ylims!((0,1.41))
xlims!((0,102))
0.5s
Julia
plot(z/12,dc.MV, legend=false)
plot!([0, 102],[1.0, 1.0], linecolor=:red, linewidth=2)
ylabel!("Shear+flexure demand/capacity ratio")
xlabel!("z [ft.]")
ylims!((0,1.41))
xlims!((0,102))
0.5s
Julia

Purlin line capacity trends under uplift loading

The purlin line failure pressure under uplift loading is calculated with varying bracing conditions to show what influences the calculated failure pressure.

kx=[0.0:0.02:0.1;0.15:0.05:0.3]
=0.0:0.05:0.1
eqn=zeros(length(kx),length())
for i in eachindex(kx)
    for j in eachindex()
        BracingProperties=[(kx[i],[j],25.0*12, 25.0*12)]
    
        eqn[i,j], z, strengths, forces, interactions, dc =                 PurlinDesigner.lineStrength(ASDorLRFD, GravityOrUplift, MemberDefinitions,       SectionProperties, CrossSectionDimensions, MaterialProperties, LoadLocation,     BracingProperties, RoofSlope, EndBoundaryConditions, Supports)
    end
end
758.5s
Julia
FailurePressure=eqn./PurlinSpacing .*1000 .*144;
0.4s
Julia
plot(kx,FailurePressure[:,1],  markershape=:circle, label="kphi=0.0")
plot!(kx,FailurePressure[:,2], markershape=:square, label="kphi=0.05")
plot!(kx,FailurePressure[:,3], markershape=:diamond, label="kphi=0.10")
ylabel!("ASD expected uplift roof capacity [psf]")
xlabel!("kx [kips/in./in.]")
ylims!(-22.0, 0.0)
1.8s
Julia

Conclusions

This example highlights how the AISI specification, the Direct Strength Method, and open-source software can be used to calculate the strength of a purlin line supporting a standing seam roof in a metal building.

  • Distortional buckling in the exterior spans is the controlling limit state for a gravity loading. This could be remedied by decreasing the standing seam roof clip spacing.

  • Bending+torsion interaction at the first interior support is the controlling limit state for an uplift loading. The purlin flanges get worked hard in the splice region as the purlin twists and bends.

  • Purlin line strength gets big help from small amounts of lateral stiffness kx. Rotational stiffness is less important.

Ongoing Work

Work continues on the following:

  • add a local buckling calculator to this workflow

  • shell finite verification studies of PlautBeam solutions including translational and rotational springs

  • add pattern loads and point loads

  • add discrete springs that could be used to model intermediate bracing

  • make this workflow accessible with an API

  • increase calculation speed and efficiency in preparation for optimization and machine learning studies

  • add 3D visualization and a web UI

Appendix - verification studies

Verification studies of the AISIS10016 module are performed as unit test sets on GitHub, see the /tests folder. Critical elastic local and distortional buckling are verified with CUFSM, and Direct Strength Method calculations are verified with a spreadsheet downloaded from the Hopkins Thin-Walled Structures Group website.

Verification studies of the PlautBeam module include first order analysis deflections and internal forces that were confirmed to match MASTAN2. It was determined that any further second order analysis verification with MASTAN2 did not make sense since it is not very easy to include distributed springs and the second order formulation is for doubly-symmetric I-sections, especially the Lagrangian body-fixed coordinate system terms in the geometric stiffness matrix.

Some verification of the PlautBeam module has been completed with shell finite element analysis in LS-DYNA for the case of a single span Z purlin under gravity load studied in Example 2 of Plaut and Moen (2020). "Lateral-Torsional Deformations of C-Section and Z-Section Beams with Continuous Bracing." The first study with inline_formula not implemented predicted consistent u, v, and inline_formula not implemented inline_formula not implemented to LS-DYNA under gravity loads.

The second LS-DYNA gravity load second study with inline_formula not implemented, inline_formula not implemented=27.826 mm (1.096 in.), and inline_formula not implemented = 101.6 mm (4.0 in.) showed that PlautBeam underpredicted u, v, and inline_formula not implemented compared to shell finite element analysis by as much as 70%, compare u of 2.0 mm to 1.3 mm, and inline_formula not implemented =0.020 radians to 0.013 radians. This difference is partially because of cross-section deformation that occurs when the load is applied to the flange, and partially because PlautBeam uses a space-fixed coordinate system for its second-order analysis instead of a body-fixed coordinate system. Even though the deformations are underpredicted by PlautBeam, it is expected that the internal moments and torsion calculated from the LS-DYNA deformations will be consistent with PlautBeam because they are dependent upon changes in the deformations, not the absolute magnitudes.

A study is also underway that will compare flexural capacity predictions from PurlinDesigner with existing simple span purlin tests supporting a screw fastened roof. This study will be presented at the Cold-Formed Steel Research Consortium Colloquium coming up in November 2020.

Runtimes (1)