YogiPWD

Analysis of Columns in ULS strength check

Analysis of Columns in ULS Strength Check

Analysis of Columns in ULS Strength Check

  1. For cross-sections subjected to pure longitudinal compression, the compressive strain in concrete is limited to $\varepsilon_{c2}$.
  2. For cross-sections subjected to axial compressive force and bending moment, where the section is not fully in compression and the neutral axis lies within the section, the strain at the most compressed face shall be taken as $\varepsilon_{cu2}$, using a parabolic–rectangular stress–strain diagram.
  3. For cross-sections subjected to axial compression and bending moment, where the neutral axis lies outside the section, the strain at the outermost fiber shall be reduced, maintaining the stress at a distance of $(1 - \varepsilon_{c2}/\varepsilon_{cu2})h$ from the most compressed face as $\varepsilon_{c2}$.
The particular case arises when the column suffers only compressive strain and no tensile strain is developed. The strain at the highly compressed face is 0.0035 − 0.75 times the strain at the least compressed face.
In this case, the column extreme fiber shall not be allowed to reach a strain of 0.0035 unless the strain at the other face is zero.
For columns:
$$ N = f_{av} b x + f'_s A'_s - f_s A_s $$
Taking moments about the centre:
$$ M_{rd} = \beta_1 f_{cd} b x_u \left( \frac{h}{2} - \beta_2 x \right) + \sum f'_s A'_s \left( \frac{h}{2} - d' \right) + \sum f_s A_s \left( \frac{h}{2} - d \right) $$

Step 1: Assume the position of the neutral axis.

Step 2: Determine the strain in steel and the corresponding stress for the assumed neutral axis.

$$ f_c = f_{cd} \left[ 1 - \left( 1 - \frac{\varepsilon_c}{\varepsilon_{cu}} \right)^2 \right] $$

Step 3: Substitute the calculated stresses in Equation (1) and evaluate the axial force capacity $N$.

Step 4: Estimate the moment capacity and verify that $M_{rd} \ge M_{Ed}$.

Step 5: If the moment capacity does not satisfy the applied moment, change the assumed neutral axis depth $x_u$ and start the next trial.

or

Use the following VBA function to automatically determine the neutral axis depth that satisfies axial force equilibrium:

$$ C + T = P $$
Where,
C = Compression force above the neutral axis
T = Tension force below the neutral axis
P = Applied axial force on the column

For Circular Pier

Optimized Function for Circular Sections

Public Function xulc_circular(D As Double, cov As Double, dia As Double, N As Integer, _
    Fcd As Double, fyd As Double, pu As Double) As Double

    Dim min_x As Double, max_x As Double
    Dim mid_x As Double
    Dim tol As Double
    Dim max_iter As Long
    Dim iter As Long

    ' Reasonable search bounds
    min_x = 0.001                  ' Avoid zero division
    max_x = D * 3                  ' Usually sufficient for circular sections

    tol = 0.00001                  ' 0.01 mm tolerance
    max_iter = 60                  ' Safety limit
    iter = 0                       ' Initialize iterator

    Do While (max_x - min_x) > tol And iter < max_iter
        iter = iter + 1
        mid_x = (min_x + max_x) / 2
        
        Dim current_pu As Double
        current_pu = pulc(D, cov, dia, N, Fcd, fyd, mid_x)
        
        If Abs(current_pu - pu) <= tol Then
            xulc_circular = mid_x
            Exit Function
        End If
        
        ' Adjust bounds based on whether calculated Pu is higher or lower than target
        If current_pu > pu Then
            max_x = mid_x          ' Need smaller xu for less capacity
        Else
            min_x = mid_x          ' Need larger xu for more capacity
        End If
    Loop

    xulc_circular = mid_x
End Function
Note: Replace pulc(...) with your actual function that calculates the ultimate axial load for a given neutral axis depth in the circular section. The bisection assumes that Pu increases with xu (valid for typical column cases).

Optimized Function for Rectangular Piers

Public Function xu_rect(b As Double, D As Double, cov As Double, dia As Double, _
    nb As Integer, nd As Integer, Fcd As Double, fyd As Double, _
    spacd As Double, pu As Double) As Double

    Dim min_x As Double, max_x As Double
    Dim mid_x As Double
    Dim tol As Double
    Dim max_iter As Long
    Dim iter As Long

    min_x = 0.001
    max_x = D * 4                  ' Conservative upper bound

    tol = 0.00001
    max_iter = 60
    iter = 0

    Do While (max_x - min_x) > tol And iter < max_iter
        iter = iter + 1
        mid_x = (min_x + max_x) / 2
        
        Dim current_pu As Double
        current_pu = pu_rect(b, D, cov, dia, nb, nd, Fcd, fyd, spacd, mid_x)
        
        If Abs(current_pu - pu) <= tol Then
            xu_rect = mid_x
            Exit Function
        End If
        
        If current_pu > pu Then
            max_x = mid_x
        Else
            min_x = mid_x
        End If
    Loop

    xu_rect = mid_x
End Function
Note: Same assumptions as above apply. Replace pu_rect(...) with your rectangular section Pu calculation function.

Improved Bisection Method for Rectangular Sections (VBA)

The original code used GoTo statements and unnecessary rounding checks, making it hard to read and maintain. Below is a clean, simplified, and robust version using the bisection method to find the neutral axis depth xu that satisfies axial force equilibrium.

Public Function FindXu_Rect(b As Double, D As Double, cov As Double, dia As Double, _
                            nb As Integer, nd As Integer, Fcd As Double, fyd As Double, _
                            spacd As Double, pu As Double) As Double
    
    Dim minXu As Double
    Dim maxXu As Double
    Dim midXu As Double
    Dim calcPu As Double
    Dim tolerance As Double
    Dim maxIter As Long
    Dim iter As Long
    
    ' Search bounds
    minXu = 0.001                  ' Avoid division by zero
    maxXu = D * 4                  ' Conservative upper bound (neutral axis far outside)
    
    tolerance = 0.1                ' Convergence tolerance in kN (adjust as needed)
    maxIter = 100
    iter = 0
    
    Do While (maxXu - minXu > 0.001) And (iter < maxIter)
        iter = iter + 1
        midXu = (minXu + maxXu) / 2
        
        ' Calculate axial capacity at current neutral axis depth
        calcPu = pua(b, D,  cov, dia, nb, nd, Fcd, fyd, spacd, midXu)
        
        ' Check if close enough to target Pu
        If Abs(calcPu - pu) <= tolerance Then
            FindXu_Rect = midXu
            Exit Function
        End If
        
        ' Bisection: assuming pua increases with xu (typical for compression-dominated columns)
        If calcPu > pu Then
            maxXu = midXu          ' Too much capacity → reduce xu
        Else
            minXu = midXu          ' Too little capacity → increase xu
        End If
    Loop
    
    ' Return best estimate
    FindXu_Rect = midXu
End Function
Key Improvements:
  • No GoTo statements → cleaner and easier to debug.
  • Clear convergence based on absolute difference in axial load (more reliable than rounding to nearest 10).
  • Built-in iteration limit to prevent infinite loops.
  • Adjustable tolerance (e.g., 0.1 kN for high precision).
  • Assumes pua() is monotonic increasing with neutral axis depth (valid for most RC column cases under compression + bending).
Usage Note: Replace pua(...) with your actual function that computes the ultimate axial load capacity Pu for a given neutral axis depth xu. If your loading is tension-dominated (rare for columns), reverse the bisection logic.

Biaxial Bending Check as per IRC 112:2011

When a column is subjected to axial compression along with bending moments about both principal axes, the following step-by-step procedure is adopted:

  1. Step 1: Design the column independently for uniaxial bending in each direction (considering axial load + moment about one axis, treating the other moment as zero).
  2. Step 2: Check if the section satisfies both Equation 8.1 and Equation 8.2 of IRC 112:2011.
    If both equations are satisfied, no further biaxial check is required.
  3. Step 3: If either of the equations is not satisfied, perform a full biaxial bending check and ensure that Equation 8.3 of IRC 112:2011 is satisfied.
Note: Equations 8.1, 8.2, and 8.3 provide interaction criteria to verify whether uniaxial designs are adequate or a rigorous biaxial analysis is mandatory.

Worked Example: Reinforced Concrete Pier under Biaxial Bending

Reinforced concrete pier – Biaxial bending check

  • Pier size: 1800 mm × 1500 mm
  • Reinforcement: 34 nos. of 32 mm diameter bars
  • Axial load (P): 17,300 kN
  • Moment about major axis (Mx): 8,000 kNm
  • Moment about minor axis (My): 6,000 kNm
  • Grade of concrete: M60
  • Grade of steel: Fe 500
Objective: Verify the adequacy of the pier section under the given combined loading as per IRC 112:2011, including checking whether uniaxial designs are sufficient or a full biaxial interaction check is required.

Reinforcement Details

The pier has non-uniform reinforcement distribution along the two directions:

Section Dimension Number of Bars
B = 1800 mm (major axis direction) 18
D = 1500 mm (minor axis direction) 16

Total reinforcement: 34 nos. of 32 mm diameter bars (18 along the 1800 mm face and 16 along the 1500 mm face).

Mechanical Reinforcement Ratio

ω = As fyd / (Ac fcd) Pt / fck
0.161 0.017

Gross Concrete Area and Relative Humidity

Ac (mm²) Relative Humidity (RH)
2,672,656 70.00%
Note: Ac = gross sectional area = 1800 mm × 1500 mm − As (deducting steel area if required by code; value shown is typical gross area before deduction).

Design Loads and Second-Order Effects Calculation (ULS Combination)

The following table summarizes the applied loads, creep coefficients, slenderness checks, second-order eccentricity calculations, uniaxial moment capacities, and final biaxial interaction check as per relevant code provisions (e.g., IRC 112 / EN 1992-1-1).

Parameter Value
Load CombinationULS
Axial Load Pu (kN)17,300.0
MoEd current axis (kN·m)6,000.0
MoEd traffic axis (kN·m)8,000.0
φefy = φ(∞,t0)(MoEqpy/MoEdy)0.00
φefz = φ(∞,t0)(MoEqpz/MoEdz)0.11
AY = 1 / (1 + 0.2 φefy)1.00
AZ = 1 / (1 + 0.2 φefz)0.98
n = NEd / (Ac fcd)0.235
λlim Y = 20 A B C / √n33.25
Slenderness Ratio λy4.4
λlim Z = 20 A B C / √n32.53
Slenderness Ratio λz5.3
nu = 1 + ω1.161
Kr = (nu − n) / (nu − nbal)1.217
(1/r0)z = εyd / (0.45 dz)3.7 × 10−6
βz = 0.35 + fck/200 − λ/1500.615
Kφz = 1 + βz φef1.068
(1/r)z = Kr Kφz (1/r0)z4.8 × 10−6
e2z = (1/r) (le2)/c2.57
M2z = NEd e2z0.00
(1/r0)y = εyd / (0.45 dy)3.1 × 10−6
βy = 0.35 + fck/200 − λ/1500.620
Kφy = 1 + βy φef1.000
(1/r)y = Kr Kφy (1/r0)y3.8 × 10−6
e2y = (1/r) (le2)/c2.02
M2y = NEd e2y0.00
Xuz (mm)528
XuY (mm)641
MEdz (kN·m)6,000
MEdy (kN·m)8,000
MuZ1 (kN·m)16,696
MuY1 (kN·m)19,939
Pu / Puz1.0001
α1.11
(MY/MY1)α + (MZ/MZ1)α0.68
Interaction CheckOK
Conclusion: The biaxial interaction ratio is 0.68 < 1.0, and all slenderness limits are satisfied (λy << λlim Y, λz << λlim Z). Second-order moments M2y and M2z are negligible. The section is safe under the applied ULS loading.

Important VBA Codes

Axial Load Capacity for Given Neutral Axis Position

For Circular Pier

Public Function pulc(D As Double, cov As Double, dia As Double, N As Integer, _
                     Fcd As Double, fyd As Double, i As Double) As Double
    Dim j As Double
    Dim force As Double
    Dim pua As Double
    Dim ef As Double
    Dim stress As Double
    Dim strain As Double
    Dim y As Double
    Dim mo As Double
    Dim moa As Double
    Dim mua As Double
    
    ef = 0
    moa = 0
    
    For j = 1 To N
        y = D / 2 - ((D / 2 - cov) * Cos(360 / N * (j - 1) * 3.14159 / 180))
        strain = 0.0035 * (1 - y / i)
        
        If strain > 0 Then
            stress = Application.Min(strain * 200000, fyd)
        Else
            stress = Application.Max(strain * 200000, -fyd)
        End If
        
        force = stress * 3.1415 / 4 * dia ^ 2
        mo = force * (D / 2 - y)
        
        ef = ef + force
        moa = moa + mo
    Next j
    
    pua = (betac1(i / D, D, Fcd) * Fcd * area(i, D) + ef) / 1000
    pulc = pua
End Function
Note: This function calculates the ultimate axial load capacity (in kN) for a circular section at a given neutral axis depth i. It requires supporting functions betac1() and area() for concrete stress block parameters and compressed area.

For Rectangular Pier

Public Function pua(b As Double, D As Double, cov As Double, dia As Double, _
                    nb As Integer, nd As Integer, Fcd As Double, fyd As Double, _
                    spacd As Double, i As Double) As Double
    Dim j As Double
    Dim force As Double
    Dim ef As Double
    Dim stress As Double
    Dim strain As Double
    Dim y As Double
    
    ef = 0
    
    For j = 1 To (nd + 2)
        y = cov + (j - 1) * spacd
        strain = 0.0035 * (1 - y / i)
        
        If strain > 0 Then
            stress = Application.Min(strain * 200000, fyd)
        Else
            stress = Application.Max(strain * 200000, -fyd)
        End If
        
        If j = 1 Or j = (nd + 2) Then
            ' Corner and edge layers typically have more bars
            force = 3.14159 / 4 * dia ^ 2 * (nb + 2) * stress
        Else
            ' Intermediate layers have 2 bars (one on each face)
            force = 3.14159 / 4 * dia ^ 2 * 2 * stress
        End If
        
        ef = ef + force
    Next j
    
    pua = (beta1(D, Fcd, i / D) * Fcd * b * Application.Min(i, D) + ef) / 1000
    pua = pua  ' Returns axial capacity in kN
End Function
Note: This function computes the axial load capacity (in kN) for a rectangular section. It assumes uniform bar diameter and layered reinforcement. Requires a supporting beta1() function for the rectangular stress block factor.
General Notes on Both Functions:
  • Ultimate concrete strain = 0.0035 (as per IRC/Eurocode).
  • Steel modulus of elasticity assumed as 200 GPa.
  • Functions return capacity in kN (divided by 1000).
  • Typically used with bisection methods (like the earlier FindXu_Rect and xulc_circular) to solve for neutral axis depth under given axial load.

Post a Comment

0 Comments