Concrete Beam Design Tutorial (IS 456:2000)

This tutorial demonstrates reinforced concrete beam design following IS 456:2000 using the StructEngine-v2 API.

Problem Statement

Design a simply supported rectangular concrete beam with the following parameters:

  • Span: 6000 mm (6.0 m)

  • Support conditions: Simply supported

  • Loading: - Dead load: 25 kN/m (includes self-weight) - Live load: 15 kN/m

  • Materials: - Concrete grade: M25 (fck = 25 N/mm²) - Steel grade: Fe 415 (fy = 415 N/mm²)

  • Section: - Width (b): 300 mm - Overall depth (D): 500 mm - Clear cover: 25 mm

  • Design per: IS 456:2000

Step 1: Construct Input

Create the input data structure:

from api.app.calculators.concrete.conc_beam_design import ConcBeamDesignInput

# Beam design input per IS 456:2000
input_data = ConcBeamDesignInput(
    beam_type="rectangular",
    width=300,                  # mm
    depth=500,                  # mm
    span=6000,                  # mm
    concrete_grade="M25",       # fck = 25 N/mm²
    steel_grade="Fe415",        # fy = 415 N/mm²
    dead_load=25,               # kN/m
    live_load=15,               # kN/m
    clear_cover=25,             # mm
    main_bar_diameter=20,       # mm (assumed)
    stirrup_diameter=8          # mm (assumed)
)

print(f"Input validation: {input_data}")

Step 2: Make API Call

Send the request to the calculator endpoint:

import requests
import json

# API endpoint
url = "http://localhost:8000/api/calculators/beam_design/calculate"

# Send POST request
response = requests.post(
    url,
    json=input_data.dict(),
    headers={"Content-Type": "application/json"}
)

# Check response
if response.status_code == 200:
    result = response.json()
    print("Calculation successful!")
    print(json.dumps(result, indent=2))
else:
    print(f"Error: {response.status_code}")
    print(response.text)

Alternative: Using cURL

curl -X POST "http://localhost:8000/api/calculators/beam_design/calculate" \\
     -H "Content-Type: application/json" \\
     -d '{
       "beam_type": "rectangular",
       "width": 300,
       "depth": 500,
       "span": 6000,
       "concrete_grade": "M25",
       "steel_grade": "Fe415",
       "dead_load": 25,
       "live_load": 15,
       "clear_cover": 25,
       "main_bar_diameter": 20,
       "stirrup_diameter": 8
     }'

Step 3: Understanding Output

The API returns comprehensive results:

{
    "inputs": { ... },  # Echo of input

    # Material properties
    "fck": 25.0,        # N/mm²
    "fy": 415.0,        # N/mm²

    # Geometric properties
    "effective_depth": 465,  # d = D - cover - stirrup_dia - main_bar_dia/2

    # Loads and moments (IS 456 Clause 22)
    "factored_dead_load": 37.5,      # 1.5 × DL
    "factored_live_load": 22.5,      # 1.5 × LL
    "total_factored_load": 60.0,     # kN/m
    "max_bending_moment": 270.0,     # kN-m (wL²/8)
    "max_shear_force": 180.0,        # kN (wL/2)

    # Flexural design (IS 456 Clause 26.5.1.1)
    "required_steel_area": 1580,     # mm² (Ast,req)
    "min_steel_area": 225,           # mm² (0.85bd/fy)
    "max_steel_area": 15000,         # mm² (0.04bD)
    "provided_steel_area": 1570,     # mm² (5-20mm dia bars)
    "main_bars_count": 5,
    "main_bars_description": "5 nos. 20mm dia bars",

    # Shear design (IS 456 Clause 26.5.1.6)
    "shear_stress": 1.29,            # N/mm² (τv)
    "shear_capacity_concrete": 0.48, # N/mm² (τc from Table 19)
    "stirrup_spacing": 150,          # mm
    "stirrups_description": "8mm dia @ 150mm c/c",

    # Checks
    "flexure_check": "PASS",
    "shear_check": "PASS",
    "deflection_check": "PASS",
    "status": "PASS",

    # IS code references
    "remarks": [
        "Design complies with IS 456:2000",
        "Flexure: Clause 26.5.1.1",
        "Shear: Clause 26.5.1.6, Table 19",
        "Deflection: Clause 23.2"
    ]
}

Step 4: IS Code Validation

### 4.1 Effective Depth (IS 456 Clause 26.2.1)

d = D - cover - stirrup_dia - main_bar_dia / 2
d = 500 - 25 - 8 - 20/2
d = 465 mm  

### 4.2 Bending Moment (IS 456 Clause 22.2)

# Factored loads
wu = 1.5 × (DL + LL) = 1.5 × (25 + 15) = 60 kN/m  

# Maximum moment for simply supported beam
Mu = wu × L² / 8
Mu = 60 × 6² / 8
Mu = 270 kN-m  

### 4.3 Required Steel Area (IS 456 Clause 38.1, G-1.1)

# Limiting moment of resistance
Mu,lim = 0.138 × fck × b × d²
Mu,lim = 0.138 × 25 × 300 × 465² / 10^6
Mu,lim = 223 kN-m

# Since Mu (270) > Mu,lim (223), need compression steel
# OR increase depth

# For singly reinforced (if adequate):
Ast = Mu / (0.87 × fy × d × 0.9)
Ast  1580 mm²  

### 4.4 Minimum Steel (IS 456 Clause 26.5.1.1)

Ast,min = 0.85 × b × d / fy
Ast,min = 0.85 × 300 × 465 / 415
Ast,min = 285 mm²

# Provided (1570 mm²) > Minimum (285 mm²)  ✓

### 4.5 Shear Stress (IS 456 Clause 40.1)

τv = Vu / (b × d)
τv = 180,000 / (300 × 465)
τv = 1.29 N/mm²  

# From Table 19, for 1.13% steel and M25:
τc  0.48 N/mm²

# Since τv (1.29) > τc (0.48), need shear reinforcement  ✓

### 4.6 Stirrup Design (IS 456 Clause 26.5.1.6)

# Required shear steel
Vus = τv - τc = 1.29 - 0.48 = 0.81 N/mm²

# Stirrup spacing
Sv = 0.87 × fy × Asv × d / (b × Vus)
# For 2-legged 8mm stirrups: Asv = 2 × π × 4² = 100 mm²
Sv = 0.87 × 415 × 100 × 465 / (300 × 0.81)
Sv  150 mm  

# Also check maximum spacing (IS 456 Clause 26.5.1.5):
Sv,max = min(0.75d, 300mm) = min(348, 300) = 300mm
# Provided (150mm) < Maximum (300mm)  ✓

Step 5: Complete Working Example

Full Python script:

import requests

def design_beam():
    """Complete beam design example per IS 456:2000."""

    # Input data
    payload = {
        "beam_type": "rectangular",
        "width": 300,
        "depth": 500,
        "span": 6000,
        "concrete_grade": "M25",
        "steel_grade": "Fe415",
        "dead_load": 25,
        "live_load": 15,
        "clear_cover": 25,
        "main_bar_diameter": 20,
        "stirrup_diameter": 8
    }

    # API call
    response = requests.post(
        "http://localhost:8000/api/calculators/beam_design/calculate",
        json=payload
    )

    if response.status_code == 200:
        result = response.json()

        # Display results
        print("="*60)
        print("CONCRETE BEAM DESIGN (IS 456:2000)")
        print("="*60)
        print(f"Span: {payload['span']}mm")
        print(f"Section: {payload['width']}mm × {payload['depth']}mm")
        print(f"Materials: {payload['concrete_grade']}, {payload['steel_grade']}")
        print()
        print("RESULTS:")
        print(f"  Effective depth: {result['effective_depth']}mm")
        print(f"  Max moment: {result['max_bending_moment']}kN-m")
        print(f"  Max shear: {result['max_shear_force']}kN")
        print()
        print("FLEXURAL STEEL:")
        print(f"  Required: {result['required_steel_area']}mm²")
        print(f"  Provided: {result['main_bars_description']}")
        print(f"  Area: {result['provided_steel_area']}mm²")
        print()
        print("SHEAR STEEL:")
        print(f"  Shear stress: {result['shear_stress']}N/mm²")
        print(f"  Concrete capacity: {result['shear_capacity_concrete']}N/mm²")
        print(f"  Stirrups: {result['stirrups_description']}")
        print()
        print(f"STATUS: {result['status']}")
        print("="*60)

        return result
    else:
        print(f"Error: {response.status_code}")
        print(response.text)
        return None

if __name__ == "__main__":
    design_beam()

Common Pitfalls

  1. Units mismatch: Always use kN, mm, MPa, kN-m

  2. Clear cover: Don’t forget to account for stirrup diameter

  3. Effective depth: d = D - cover - stirrup - bar_dia/2

  4. Load factors: IS 456 uses 1.5 for DL + LL (Clause 36.4)

  5. Shear check: Always verify τv against τc from Table 19

Next Steps