Interactive RCC Double reinforced beam design for all civil engineering. Please refer the below video and start providing your input to get design of RCC Double reinforced beam.
body {
font-family: ‘Inter’, sans-serif;
background-color: #f8fafc; /* slate-50 */
color: #0f172a; /* slate-900 */
}
.input-group {
margin-bottom: 1rem;
}
.input-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 600;
color: #475569; /* slate-600 */
}
.input-group input, .input-group select {
width: 100%;
padding: 0.75rem;
border-radius: 0.5rem;
border: 1px solid #cbd5e1; /* slate-300 */
background-color: white;
}
.result-card {
background-color: white;
border-radius: 0.75rem;
padding: 1.5rem;
margin-bottom: 1rem;
box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
border-left: 4px solid #3b82f6; /* blue-500 */
}
.result-card.warning {
border-left-color: #f59e0b; /* amber-500 */
}
.result-card.final {
border-left-color: #22c55e; /* green-500 */
}
.formula {
font-family: ‘Courier New’, Courier, monospace;
background-color: #f1f5f9; /* slate-100 */
padding: 0.5rem 1rem;
border-radius: 0.25rem;
color: #1e293b; /* slate-800 */
margin-top: 0.5rem;
display: block;
white-space: pre-wrap;
word-wrap: break-word;
}
.beam-visual-wrapper {
position: relative;
padding: 30px;
}
.beam-container {
position: relative;
border: 2px solid #334155; /* slate-700 */
background-color: #e2e8f0; /* slate-200 */
margin: 0 auto;
}
.rebar {
position: absolute;
border-radius: 50%;
background-color: #475569; /* slate-600 */
border: 1px solid #1e293b;
z-index: 10;
}
.stirrup {
position: absolute;
border: 2px solid #64748b; /* slate-500 */
border-radius: 6px;
z-index: 5;
}
.dim-line {
position: absolute;
background-color: #94a3b8;
}
.dim-line::before, .dim-line::after {
content: ”;
position: absolute;
background-color: #94a3b8;
}
.dim-line.vertical { width: 1px; }
.dim-line.horizontal { height: 1px; }
.dim-line.vertical::before, .dim-line.vertical::after { left: -4px; width: 9px; height: 1px; }
.dim-line.vertical::before { top: 0; }
.dim-line.vertical::after { bottom: 0; }
.dim-line.horizontal::before, .dim-line.horizontal::after { top: -4px; height: 9px; width: 1px; }
.dim-line.horizontal::before { left: 0; }
.dim-line.horizontal::after { right: 0; }
.dim-label {
position: absolute;
color: #475569;
font-size: 0.75rem;
font-weight: 600;
background-color: #f8fafc;
padding: 0 4px;
}
Doubly Reinforced Beam Design Calculator
An Interactive Guide based on IS 456:2000
Input Parameters
M20
M25
M30
Fe 250
Fe 415
Fe 500
Design Calculation Steps
Step 1: Determine Limiting Moment (Mu,lim)
First, we check if the section needs to be doubly reinforced by comparing the applied moment to the section’s limiting moment capacity.
document.addEventListener(‘DOMContentLoaded’, () => {
const inputs = [‘Mu’, ‘b’, ‘D’, ‘cover’, ‘fck’, ‘fy’];
const elements = {};
inputs.forEach(id => {
elements[id] = document.getElementById(id);
elements[id].addEventListener(‘input’, calculate);
});
const steps = {
step1: document.getElementById(‘step1’),
step2: document.getElementById(‘step2’),
step3: document.getElementById(‘step3’),
step4: document.getElementById(‘step4’),
};
const results = {
mulimResult: document.getElementById(‘mulim-result’),
mulimCheck: document.getElementById(‘mulim-check’),
astlimResult: document.getElementById(‘astlim-result’),
mu2Result: document.getElementById(‘mu2-result’),
ascResult: document.getElementById(‘asc-result’),
ast2Result: document.getElementById(‘ast2-result’),
totalAstResult: document.getElementById(‘total-ast-result’),
totalAscResult: document.getElementById(‘total-asc-result’),
beamVisual: document.getElementById(‘beam-visual’),
beamVisualWrapper: document.getElementById(‘beam-visual-wrapper’)
};
function getFsc(d_dash_by_d, fy) {
const fsc_table = {
250: { 0.05: 217, 0.10: 217, 0.15: 217, 0.20: 217 },
415: { 0.05: 355, 0.10: 353, 0.15: 342, 0.20: 329 },
500: { 0.05: 424, 0.10: 412, 0.15: 395, 0.20: 370 }
};
const table = fsc_table[fy];
if (d_dash_by_d = 0.20) return table[0.20];
const lower_key = Object.keys(table).reverse().find(k => k k > d_dash_by_d);
const x1 = parseFloat(lower_key), y1 = table[lower_key];
const x2 = parseFloat(upper_key), y2 = table[upper_key];
return y1 + (y2 – y1) * (d_dash_by_d – x1) / (x2 – x1);
}
function provideBars(area, diaOptions = [25, 20, 16, 12, 10, 8]) {
if (area = 2 && numBars <= 10) {
const providedArea = numBars * areaOfOneBar;
if (providedArea < area * 1.25) { // Find a reasonably efficient option
return {
text: `${numBars} no. of ${dia}mm bars (${providedArea.toFixed(0)} mm²)`,
bars: Array(numBars).fill(dia)
};
}
}
}
return bestOption;
}
function renderVisual(container, wrapper, b, D, tensionBarData, compBarData) {
container.innerHTML = '';
wrapper.innerHTML = `
`;
const beamVisual = wrapper.querySelector(‘#beam-visual’);
const aspectRatio = b/D;
const containerHeight = 280; // in px
const containerWidth = containerHeight * aspectRatio;
beamVisual.style.width = `${containerWidth}px`;
beamVisual.style.height = `${containerHeight}px`;
const scale = containerHeight / D;
const clearCover = 25 * scale; // assume 25mm clear cover for stirrup
// Render Stirrup
const stirrup = document.createElement(‘div’);
stirrup.className = ‘stirrup’;
stirrup.style.width = `${containerWidth – 2 * clearCover}px`;
stirrup.style.height = `${containerHeight – 2 * clearCover}px`;
stirrup.style.top = `${clearCover}px`;
stirrup.style.left = `${clearCover}px`;
beamVisual.appendChild(stirrup);
// Render bars
renderBars(beamVisual, tensionBarData.bars, scale, true);
renderBars(beamVisual, compBarData.bars, scale, false);
// Render Dimensions
const dimLabelB = document.createElement(‘div’);
dimLabelB.className = ‘dim-label’;
dimLabelB.textContent = `${b} mm`;
dimLabelB.style.width = `${containerWidth}px`;
dimLabelB.style.textAlign = ‘center’;
dimLabelB.style.top = `-25px`;
dimLabelB.style.left = `0px`;
beamVisual.appendChild(dimLabelB);
const dimLineB = document.createElement(‘div’);
dimLineB.className = ‘dim-line horizontal’;
dimLineB.style.width = `${containerWidth}px`;
dimLineB.style.top = `-15px`;
dimLineB.style.left = `0px`;
beamVisual.appendChild(dimLineB);
const dimLabelD = document.createElement(‘div’);
dimLabelD.className = ‘dim-label’;
dimLabelD.textContent = `${D} mm`;
dimLabelD.style.height = `${containerHeight}px`;
dimLabelD.style.writingMode = ‘vertical-rl’;
dimLabelD.style.transform = ‘rotate(180deg)’;
dimLabelD.style.textAlign = ‘center’;
dimLabelD.style.left = `-30px`;
dimLabelD.style.top = `0px`;
beamVisual.appendChild(dimLabelD);
const dimLineD = document.createElement(‘div’);
dimLineD.className = ‘dim-line vertical’;
dimLineD.style.height = `${containerHeight}px`;
dimLineD.style.left = `-20px`;
dimLineD.style.top = `0px`;
beamVisual.appendChild(dimLineD);
}
function renderBars(container, bars, scale, isTension) {
const maxBarsPerRow = 5;
const numBars = bars.length;
if (numBars === 0) return;
const rows = [];
if (numBars {
const yPos = isTension
? container.clientHeight – (50 * scale) – (rowIndex * 30 * scale)
: (50 * scale) + (rowIndex * 30 * scale);
const numInRow = row.length;
const spacing = container.clientWidth / (numInRow + 1);
row.forEach((dia, i) => {
const bar = document.createElement(‘div’);
bar.className = ‘rebar’;
const barDiaVisual = Math.max(dia * scale, 6);
bar.style.width = `${barDiaVisual}px`;
bar.style.height = `${barDiaVisual}px`;
bar.style.left = `${(i + 1) * spacing – barDiaVisual / 2}px`;
bar.style.top = `${yPos – barDiaVisual / 2}px`;
container.appendChild(bar);
});
});
}
function calculate() {
const Mu = parseFloat(elements.Mu.value) || 0;
const b = parseFloat(elements.b.value) || 0;
const D = parseFloat(elements.D.value) || 0;
const cover = parseFloat(elements.cover.value) || 0;
const fck = parseFloat(elements.fck.value) || 0;
const fy = parseFloat(elements.fy.value) || 0;
if ([Mu, b, D, cover, fck, fy].some(v => v <= 0) || D <= cover) {
results.mulimResult.innerHTML = '
Please provide all valid inputs. Overall depth must be greater than cover.
‘;
Object.values(steps).forEach((s, i) => i > 0 ? s.classList.add(‘hidden’) : null);
return;
}
const d = D – cover;
const xu_max_ratio = (fy === 250) ? 0.53 : (fy === 415) ? 0.48 : 0.46;
const xu_max = xu_max_ratio * d;
const Mu_lim_val = (0.36 * xu_max_ratio * (1 – 0.42 * xu_max_ratio) * fck * b * d * d) / 1e6;
results.mulimResult.innerHTML = `
Effective Depth, d = ${D} – ${cover} = ${d.toFixed(2)} mm
For Fe${fy}, xu,max = ${xu_max_ratio}d = ${xu_max.toFixed(2)} mm
Mu,lim = 0.36 * xu,max/d * (1 - 0.42 * xu,max/d) * fck * b * d²
Limiting Moment (Mu,lim) = ${Mu_lim_val.toFixed(2)} kNm
`;
if (Mu > Mu_lim_val) {
results.mulimCheck.innerHTML = `
Since Mu (${Mu} kNm) > Mu,lim (${Mu_lim_val.toFixed(2)} kNm), a doubly reinforced section is required.
`;
Object.values(steps).forEach(s => s.classList.remove(‘hidden’));
const Ast_lim = (0.5 * fck / fy) * (1 – Math.sqrt(1 – (4.6 * Mu_lim_val * 1e6) / (fck * b * d * d))) * b * d;
results.astlimResult.innerHTML = `
Ast,lim = ${Ast_lim.toFixed(2)} mm²
`;
const Mu2 = Mu – Mu_lim_val;
results.mu2Result.innerHTML = `
Additional Moment, Mu2 = ${Mu} – ${Mu_lim_val.toFixed(2)} = ${Mu2.toFixed(2)} kNm
`;
const d_dash_by_d = cover / d;
const fsc = getFsc(d_dash_by_d, fy);
const fcc = 0.45 * fck;
const Asc = (Mu2 * 1e6) / ((fsc – fcc) * (d – cover));
const Ast2 = (Asc * (fsc – fcc)) / (0.87 * fy);
results.ascResult.innerHTML = `
For d’/d = ${(d_dash_by_d).toFixed(2)}, Stress in Compression Steel, fsc ≈ ${fsc.toFixed(2)} N/mm²
Asc = Mu2 / [(fsc - 0.45fck) * (d - d')]
Compression Steel (Asc) = ${Asc.toFixed(2)} mm²
`;
results.ast2Result.innerHTML = `
Ast2 = (Asc * (fsc - 0.45fck)) / (0.87 * fy)
Additional Tension Steel (Ast2) = ${Ast2.toFixed(2)} mm²
`;
const total_Ast = Ast_lim + Ast2;
const total_Asc = Asc;
const tensionBarData = provideBars(total_Ast);
const compBarData = provideBars(total_Asc);
results.totalAstResult.innerHTML = `
Tension Steel (Ast)
Ast = Ast,lim + Ast2 = ${Ast_lim.toFixed(0)} + ${Ast2.toFixed(0)}
${total_Ast.toFixed(2)} mm²
Provide: ${tensionBarData.text}
`;
results.totalAscResult.innerHTML = `
Compression Steel (Asc)
${total_Asc.toFixed(2)} mm²
Provide: ${compBarData.text}
`;
renderVisual(results.beamVisual, results.beamVisualWrapper, b, D, tensionBarData, compBarData);
} else {
results.mulimCheck.innerHTML = `
Since Mu (${Mu} kNm) <= Mu,lim (${Mu_lim_val.toFixed(2)} kNm), a singly reinforced section is sufficient. No need for compression reinforcement.
`;
steps.step2.classList.add(‘hidden’);
steps.step3.classList.add(‘hidden’);
steps.step4.classList.add(‘hidden’);
}
}
calculate();
});
