% Simple RC-SRP Script Calculator (Inline Configuration) % Author: Rembrant Oyangoren Albeos % Year: 2026 clear; clc; %% --- CONFIGURABLE SETTINGS --- % Modify these variables directly before running the script. % Concrete and Steel Properties fc = 4000; % Concrete compressive strength f_c' (psi) fy = 60000; % Steel yield strength f_y (psi) % Beam Dimensions b = 12; % Beam width b (in) h = 20; % Beam height h (in) cover = 2.5; % Cover distance to extreme tension layer (in) % Layer 1 (Bottom) Reinforcement n_bars1 = 4; % Number of bars in layer 1 a_bar = 0.79; % Area per bar (in^2) % Layer 2 (Top) Reinforcement % Set n_bars2 to 0 for a Single Layer computation. n_bars2 = 0; % Number of bars in layer 2 spacing = 0; % Spacing between layers (in) % Output Option show_output = true; % Set to true to display calculation output in Command Window %% --- CALCULATION LOGIC --- if show_output disp(' '); disp('--- CALCULATION OUTPUT ---'); % Basic constants fc_ksi = fc / 1000; fy_ksi = fy / 1000; Es_ksi = 29000; E_cu = 0.003; % Calculate beta1 factor beta1 = 0.85; if fc > 4000 beta1 = 0.85 - 0.05 * ((fc - 4000) / 1000); end beta1 = max(beta1, 0.65); % Minimum steel factor limit_val = 3 * sqrt(fc); As_min_factor = max(limit_val, 200); % Determine if it's Single or Double Layer automatically if n_bars2 == 0 layer_type = 'Single Layer Singly Reinforced'; % --- SINGLE LAYER CALCULATION --- d = h - cover; As = n_bars1 * a_bar; disp(['1. Effective depth (d): ', num2str(d), ' in']); disp([' Area of steel (A_s): ', num2str(As), ' in^2']); % Force and depth of compression block T = As * fy_ksi; disp(['2. Tension force (T, assuming yield): ', num2str(T), ' kips']); a = T / (0.85 * fc_ksi * b); c = a / beta1; disp(['3. Compression block depth (a): ', num2str(a), ' in']); disp([' Neutral axis depth (c): ', num2str(c), ' in']); % Check if steel actually yields eps_y = fy_ksi / Es_ksi; eps_s = ((d - c) / c) * E_cu; disp(['4. Yield strain (eps_y): ', num2str(eps_y)]); disp([' Steel strain (eps_s): ', num2str(eps_s)]); if eps_s >= eps_y disp(' Status: Steel yielded. Assumption OK.'); else disp(' Status: Steel did NOT yield. Assumption failed.'); end % Calculate Nominal Moment Mn = T * (d - a/2) / 12; disp(['5. Nominal Moment (M_n): ', num2str(Mn), ' kip-ft']); % Check minimum code requirement for steel As_min = (As_min_factor / fy) * b * d; disp(['6. Minimum steel (A_s,min): ', num2str(As_min), ' in^2']); if As >= As_min disp(' Status: A_s >= A_s,min. OK.'); else disp(' Status: A_s < A_s,min. Does not meet minimum requirement.'); end % Compute reduction factor eps_t = eps_s; if eps_t >= 0.005 phi = 0.90; elseif eps_t <= 0.002 phi = 0.65; else phi = 0.65 + (eps_t - 0.002) * (250/3); end phi_Mn = phi * Mn; disp(['7. Reduction factor (phi): ', num2str(phi)]); disp(['8. Design Moment (phi*M_n): ', num2str(phi_Mn), ' kip-ft']); else layer_type = 'Double Layer Singly Reinforced'; % --- DOUBLE LAYER CALCULATION --- As1 = n_bars1 * a_bar; As2 = n_bars2 * a_bar; As = As1 + As2; dist1 = cover; dist2 = cover + spacing; % Calculate centroid of steel g = (As1 * dist1 + As2 * dist2) / As; d = h - g; d_t = h - cover; disp(['1. Centroid distance (g): ', num2str(g), ' in']); disp([' Effective depth (d): ', num2str(d), ' in']); disp([' Area of steel (A_s): ', num2str(As), ' in^2']); % Force and depth of compression block T = As * fy_ksi; a = T / (0.85 * fc_ksi * b); c = a / beta1; disp(['2. Tension force (T, assuming yield): ', num2str(T), ' kips']); disp(['3. Compression block depth (a): ', num2str(a), ' in']); disp([' Neutral axis depth (c): ', num2str(c), ' in']); % Check if steel yields eps_y = fy_ksi / Es_ksi; eps_s = ((d - c) / c) * E_cu; disp(['4. Yield strain (eps_y): ', num2str(eps_y)]); disp([' Steel strain (eps_s): ', num2str(eps_s)]); if eps_s < eps_y disp(' Status: Over-reinforced section. Assumption Failed.'); disp(' Solving exact c using quadratic method...'); % Use quadratic for exact answer if not yielded A_quad = 0.85 * fc_ksi * b * beta1; B_quad = As * Es_ksi * E_cu; C_quad = -1 * As * Es_ksi * E_cu * d; roots_c = roots([A_quad, B_quad, C_quad]); c = max(roots_c(roots_c > 0)); a = beta1 * c; disp([' Exact Neutral axis (c): ', num2str(c), ' in']); disp([' Exact Compression block (a): ', num2str(a), ' in']); T = As * Es_ksi * ((d - c)/c) * E_cu; disp([' Exact Tension force (T): ', num2str(T), ' kips']); else disp(' Status: Steel yielded. Assumption OK.'); end % Calculate Nominal Moment Mn = T * (d - a/2) / 12; disp(['5. Nominal Moment (M_n): ', num2str(Mn), ' kip-ft']); % Check minimum code requirement for steel As_min = (As_min_factor / fy) * b * d; disp(['6. Minimum steel (A_s,min): ', num2str(As_min), ' in^2']); if As >= As_min disp(' Status: A_s >= A_s,min. OK.'); else disp(' Status: A_s < A_s,min. Does not meet minimum requirement.'); end % Compute reduction factor using extreme tension layer eps_t = ((d_t - c) / c) * E_cu; if eps_t >= 0.005 phi = 0.90; elseif eps_t <= 0.002 phi = 0.65; else phi = 0.65 + (eps_t - 0.002) * (250/3); end phi_Mn = phi * Mn; disp(['7. Extreme tension strain (eps_t): ', num2str(eps_t)]); disp([' Reduction factor (phi): ', num2str(phi)]); disp(['8. Design Moment (phi*M_n): ', num2str(phi_Mn), ' kip-ft']); end disp(' '); disp(['CONCLUSION: The calculated section is [', layer_type, '].']); end