Analysis of Columns in ULS Strength Check
- For cross-sections subjected to pure longitudinal compression, the compressive strain in concrete is limited to $\varepsilon_{c2}$.
- 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.
- 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}$.
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.
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 = 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
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
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
- No
GoTostatements → 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).
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:
- 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).
-
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. - 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.
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
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% |
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 Combination | ULS |
| 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 / √n | 33.25 |
| Slenderness Ratio λy | 4.4 |
| λlim Z = 20 A B C / √n | 32.53 |
| Slenderness Ratio λz | 5.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 − λ/150 | 0.615 |
| Kφz = 1 + βz φef | 1.068 |
| (1/r)z = Kr Kφz (1/r0)z | 4.8 × 10−6 |
| e2z = (1/r) (le2)/c | 2.57 |
| M2z = NEd e2z | 0.00 |
| (1/r0)y = εyd / (0.45 dy) | 3.1 × 10−6 |
| βy = 0.35 + fck/200 − λ/150 | 0.620 |
| Kφy = 1 + βy φef | 1.000 |
| (1/r)y = Kr Kφy (1/r0)y | 3.8 × 10−6 |
| e2y = (1/r) (le2)/c | 2.02 |
| M2y = NEd e2y | 0.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 / Puz | 1.0001 |
| α | 1.11 |
| (MY/MY1)α + (MZ/MZ1)α | 0.68 |
| Interaction Check | OK |
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
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
beta1() function for the rectangular stress block factor.
- 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_Rectandxulc_circular) to solve for neutral axis depth under given axial load.
0 Comments
If you have any doubts, suggestions , corrections etc. let me know