Last active
October 3, 2023 21:38
-
-
Save jsb2505/5c178fd15d776f03fefdf2f7cda13eb9 to your computer and use it in GitHub Desktop.
A module of timber functions for excel AFE
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Materials = {"Softwood", "Hardwood", "Glulam", "LVL", "Green_Oak"}; | |
| Material_Properties = { | |
| "strength_class", | |
| "f_m_y_k", | |
| "f_v_k", | |
| "f_c_90_k", | |
| "E_0_mean", | |
| "G_mean", | |
| "E_005", | |
| "G_005", | |
| "ρ_k", | |
| "ρ_mean", | |
| "s_factor" | |
| }; | |
| Softwood_Table = { | |
| // strength_class, f_m_y_k, f_v_k, f_c_90_k, E_0_mean, G_mean, E_005, G_005, ρ_k, ρ_mean, s_factor | |
| "C14", 14, 3, 2, 7000, 440, 4700, "NA", 290, 350, "NA"; | |
| "C16", 16, 3.2, 2.2, 8000, 500, 5400, "NA", 310, 370, "NA"; | |
| "C18", 18, 3.4, 2.2, 9000, 560, 6000, "NA", 320, 380, "NA"; | |
| "C20", 20, 3.6, 2.3, 9500, 590, 6400, "NA", 330, 400, "NA"; | |
| "C22", 22, 3.8, 2.4, 10000, 630, 6700, "NA", 340, 410, "NA"; | |
| "C24", 24, 4, 2.5, 11000, 690, 7400, "NA", 350, 420, "NA"; | |
| "C27", 27, 4, 2.5, 11500, 720, 7700, "NA", 360, 430, "NA"; | |
| "C30", 30, 4, 2.7, 12000, 750, 8000, "NA", 380, 460, "NA"; | |
| "C35", 35, 4, 2.7, 13000, 810, 8700, "NA", 390, 470, "NA"; | |
| "C40", 40, 4, 2.8, 14000, 880, 9400, "NA", 400, 480, "NA"; | |
| "C45", 45, 4, 2.9, 15000, 940, 10000, "NA", 410, 490, "NA"; | |
| "C50", 50, 4, 3, 16000, 1000, 10700, "NA", 430, 520, "NA" | |
| }; | |
| Hardwood_Table = { | |
| // strength_class, f_m_y_k, f_v_k, f_c_90_k, E_0_mean, G_mean, E_005, G_005, ρ_k, ρ_mean, s_factor | |
| "D18", 18, 3.5, 4.8, 9500, 590, 8000, "NA", 475, 570, "NA"; | |
| "D24", 24, 3.7, 4.9, 10000, 630, 8400, "NA", 485, 580, "NA"; | |
| "D27", 27, 3.8, 5.1, 10500, 660, 8800, "NA", 510, 610, "NA"; | |
| "D30", 30, 3.9, 5.3, 11000, 690, 9200, "NA", 530, 640, "NA"; | |
| "D35", 35, 4.1, 5.4, 12000, 750, 10100, "NA", 540, 650, "NA"; | |
| "D40", 40, 4.2, 5.5, 13000, 810, 10900, "NA", 550, 660, "NA"; | |
| "D45", 45, 4.4, 5.8, 13500, 840, 11300, "NA", 580, 700, "NA"; | |
| "D50", 50, 4.5, 6.2, 14000, 880, 11800, "NA", 620, 740, "NA"; | |
| "D55", 55, 4.7, 6.6, 15500, 970, 13000, "NA", 660, 790, "NA"; | |
| "D60", 60, 4.8, 10.5, 17000, 1060, 14300, "NA", 700, 840, "NA"; | |
| "D65", 65, 5, 11.3, 18500, 1160, 15500, "NA", 750, 900, "NA"; | |
| "D70", 70, 5, 12, 20000, 1250, 16800, "NA", 800, 960, "NA"; | |
| "D75", 75, 5, 12.8, 22000, 1380, 18500, "NA", 850, 1020, "NA"; | |
| "D80", 80, 5, 13.5, 24000, 1500, 20200, "NA", 900, 1080, "NA" | |
| }; | |
| Glulam_Table = { | |
| // strength_class, f_m_y_k, f_v_k, f_c_90_k, E_0_mean, G_mean, E_005, G_005, ρ_k, ρ_mean, s_factor | |
| "GL24h", 24, 3.5, 2.5, 11500, 650, 9600, 540, 385, 420, "NA"; | |
| "GL28h", 28, 3.5, 2.5, 12600, 650, 10500, 540, 425, 460, "NA"; | |
| "GL32h", 32, 3.5, 2.5, 14200, 650, 11800, 540, 440, 490, "NA"; | |
| "GL36h", 36, 3.5, 2.5, 15000, 650, 12200, 540, 455, 520, "NA"; | |
| "GL24c", 24, 3.5, 2.5, 11000, 650, 9100, 540, 365, 400, "NA"; | |
| "GL28c", 28, 3.5, 2.5, 12500, 650, 10400, 540, 390, 420, "NA"; | |
| "GL32c", 32, 3.5, 2.5, 13500, 650, 11200, 540, 400, 440, "NA"; | |
| "GL36c", 36, 3.5, 2.5, 14700, 650, 11900, 540, 430, 465, "NA" | |
| }; | |
| LVL_Table = { | |
| // strength_class, f_m_y_k, f_v_k, f_c_90_k, E_0_mean, G_mean, E_005, G_005, ρ_k, ρ_mean, s_factor | |
| "LVL-S44", 44, 5.7, 3.4, 13500, 600, 11600, 400, 480, 510, 0.12; | |
| "LVL-Q28", 28, 5.7, 9, 10000, 600, 8300, 400, 480, 510, 0.12; | |
| "LVL-Q32", 32, 5.7, 9, 10500, 600, 8800, 400, 480, 510, 0.12 | |
| }; | |
| Green_Oak_Table = { | |
| // strength_class, f_m_y_k, f_v_k, f_c_90_k, E_0_mean, G_mean, E_005, G_005, ρ_k, ρ_mean, s_factor | |
| "TH1", 30, 3, 8, 10000, 600, 8000, "NA", 569, 680, "NA"; | |
| "TH2", 24.4, 3, 8, 6720, 420, 6590, "NA", 598, 704, "NA"; | |
| "THA", 40, 3.8, 8.8, 11000, 700, 9400, "NA", 595, 713, "NA"; | |
| "THB", 30, 3, 8, 10000, 600, 8000, "NA", 584, 692, "NA" | |
| }; | |
| Get_Property_Index = LAMBDA(material_property, XMATCH(material_property, Material_Properties)); | |
| Get_Properties_Value = LAMBDA(strength_class, material_property, material, | |
| LET( | |
| material_index, XMATCH(material, Materials), | |
| material_table, CHOOSE( | |
| material_index, | |
| Softwood_Table, | |
| Hardwood_Table, | |
| Glulam_Table, | |
| LVL_Table, | |
| Green_Oak_Table | |
| ), | |
| strength_class_property_index, Get_Property_Index("strength_class"), | |
| material_property_index, Get_Property_Index(material_property), | |
| strength_classes, CHOOSECOLS(material_table, strength_class_property_index), | |
| strength_class_index, XMATCH(strength_class, strength_classes), | |
| INDEX(material_table, strength_class_index, material_property_index) | |
| ) | |
| ); | |
| Get_γ_M = LAMBDA(material, | |
| IFS( | |
| OR(material = "Softwood", material = "Hardwood", material = "Green_Oak"), | |
| 1.3, | |
| material = "Glulam", | |
| 1.25, | |
| material = "LVL", | |
| 1.2 | |
| ) | |
| ); | |
| Get_K_c_90 = LAMBDA(material, [bearing_support_condition], | |
| IF( | |
| OR( | |
| ISOMITTED(bearing_support_condition), | |
| bearing_support_condition = "No enhancement", | |
| AND(material <> "Softwood", material <> "Glulam") | |
| ), | |
| 1, | |
| IFS( | |
| bearing_support_condition = "Continuous", | |
| IF(material = "Softwood", 1.25, 1.5), | |
| bearing_support_condition = "Discrete", | |
| IF(material = "Softwood", 1.5, 1.75) | |
| ) | |
| ) | |
| ); | |
| Get_K_strut = LAMBDA(is_strutted, IF(is_strutted, 0.97, 1)); | |
| Get_K_n = LAMBDA(material, | |
| IFS( | |
| OR(material = "Softwood", material = "Hardwood", material = "Green_Oak"), | |
| 5, | |
| material = "Glulam", | |
| 6.5, | |
| material = "LVL", | |
| 4.5 | |
| ) | |
| ); | |
| Get_K_form = LAMBDA(material, | |
| IF( | |
| OR( | |
| material = "Softwood", | |
| material = "Hardwood", | |
| material = "Green_Oak", | |
| material = "Glulam", | |
| material = "LVL" | |
| ), | |
| 1.2, | |
| NA() | |
| ) | |
| ); | |
| Get_K_mod = LAMBDA(service_class, load_duration, | |
| LET( | |
| SC, service_class, | |
| LD, MATCH( | |
| load_duration, | |
| {"Permanent", "Long term", "Medium term", "Short term", "Instantaneous"}, | |
| 0 | |
| ), | |
| SC_1, {0.6; 0.7; 0.8; 0.9; 1.1}, | |
| SC_2, {0.6; 0.7; 0.8; 0.9; 1.1}, | |
| SC_3, {0.5; 0.55; 0.65; 0.7; 0.9}, | |
| INDEX(CHOOSE(SC, SC_1, SC_2, SC_3), LD) | |
| ) | |
| ); | |
| Get_K_def = LAMBDA(service_class, material, | |
| IFS( | |
| OR(material = "Softwood", material = "Hardwood", material = "Glulam", material = "LVL"), | |
| CHOOSE(service_class, 0.6, 0.8, 2), | |
| material = "Green_Oak", | |
| CHOOSE(service_class, 1.6, 1.8, 2) | |
| ) | |
| ); | |
| Get_K_h = LAMBDA(height, material, [LVL_size_factor], | |
| LET( | |
| s, IF(ISOMITTED(LVL_size_factor), 0.12, LVL_size_factor), | |
| IFS( | |
| OR(material = "Softwood", material = "Hardwood", material = "Green_Oak"), | |
| IF(height <= 150, MIN((150 / height) ^ 0.2, 1.3), 1), | |
| material = "Glulam", | |
| IF(height <= 600, MIN((600 / height) ^ 0.1, 1.1), 1), | |
| material = "LVL", | |
| MIN((300 / height) ^ s, 1.2) | |
| // size effect factor for LVL is declared by manufacturer | |
| ) | |
| ) | |
| ); | |
| Get_K_sys = LAMBDA(is_load_sharing, IF(is_load_sharing, 1.1, 1)); | |
| Get_K_cr = LAMBDA(material, | |
| IF( | |
| OR( | |
| material = "Softwood", | |
| material = "Hardwood", | |
| material = "Green_Oak", | |
| material = "Glulam" | |
| ), | |
| 0.67, | |
| 1 | |
| ) | |
| ); | |
| Get_K_crit = LAMBDA(relative_slenderness, | |
| LET( | |
| λ_rel_m, relative_slenderness, | |
| IFS( | |
| λ_rel_m <= 0.75, | |
| 1, | |
| λ_rel_m <= 1.4, | |
| 1.56 - 0.75 * λ_rel_m, | |
| λ_rel_m > 1.4, | |
| 1 / λ_rel_m ^ 2 | |
| ) | |
| ) | |
| ); | |
| /** | |
| Notch shear strength reduction factor | |
| */ | |
| Get_k_v = LAMBDA( | |
| notch_face, | |
| material, | |
| height, | |
| notch_depth, | |
| bearing_length, | |
| distance_to_notch_from_edge_of_support, | |
| [length_of_sloping_notch], | |
| LET( | |
| k_n, Get_K_n(material), | |
| h, height, | |
| h_n, notch_depth, | |
| h_ef, h - h_n, | |
| l_b, bearing_length, | |
| x, IF( | |
| notch_Face = "Top", | |
| distance_to_notch_from_edge_of_support, | |
| (l_b / 2) + distance_to_notch_from_edge_of_support | |
| ), | |
| α, Get_Notch_Ratio(h, h_n), | |
| x_2, IF(ISOMITTED(length_of_sloping_notch), 0, length_of_sloping_notch), | |
| IF( | |
| notch_face = "Top", | |
| 1, | |
| /* Possible enhancement strength enhancement possible if using BS 5268-2, Cl 2.10.4 | |
| IF(x > h_ef, | |
| 1, | |
| (h * (h_ef - x) + (x * h_ef)) / h_ef^2 | |
| ), */ | |
| MIN( // Bottom | |
| (k_n * (1 + 1.1 * (x_2 / (h - h_ef)) ^ 1.5 / SQRT(h))) / | |
| (SQRT(h) * (SQRT(α * (1 - α)) + 0.8 * x * SQRT((1 / α) - α ^ 2) / h)), | |
| 1 | |
| ) | |
| ) | |
| ) | |
| ); | |
| /** | |
| EC5 Eq 6.31 | |
| */ | |
| Get_Critical_Bending_Stress = LAMBDA(breadth, height, effective_length, strength_class, material, | |
| LET( | |
| b, breadth, | |
| h, height, | |
| l_eff, effective_length, | |
| E_005, Get_Properties_Value(strength_class, "E_005", material), | |
| I_z, h * b ^ 3 / 12, | |
| I_t, Get_Torsional_Moment_Of_Inertia(b, h), | |
| G_005, Get_G_005(material, strength_class, b, h), | |
| W_el_y, Get_Elastic_Modulus(b, h), | |
| (PI() / (l_eff * w_el_y)) * (SQRT(E_005 * I_z * G_005 * I_t)) | |
| ) | |
| ); | |
| Get_Relative_Slenderness = LAMBDA(characteristic_bending_strength, critical_bending_stress, | |
| LET( | |
| f_m_y_k, characteristic_bending_strength, | |
| σ_m_crit, critical_bending_stress, | |
| SQRT(f_m_y_k / σ_m_crit) | |
| ) | |
| ); | |
| Get_Constant_For_Unit_Impulse_Velocity = LAMBDA(a_lim, | |
| IF(a_lim <= 1, 180 - 60 * a_lim, 160 - 40 * a_lim) | |
| ); | |
| Get_Deflection_Limit_For_1kN_Point_Load = LAMBDA(floor_span, | |
| LET(L, floor_span, IF(L <= 4000, 1.8, 16500 / L ^ 1.1)) | |
| ); | |
| Get_Fundamental_Frequency = LAMBDA(floor_span, joist_stiffness_per_metre, mass, | |
| LET( | |
| L, floor_span / 10 ^ 3, | |
| EI_l, joist_stiffness_per_metre / 10 ^ 6, | |
| m, mass, | |
| (PI() / (2 * L ^ 2)) * SQRT(EI_l / m) | |
| ) | |
| ); | |
| Get_Impulse_Velocity_Limit = LAMBDA(b_lim, fundamental_frequency, modal_damping_ratio, | |
| LET(f_1, fundamental_frequency, zeta, modal_damping_ratio, b_lim ^ (f_1 * zeta - 1)) | |
| ); | |
| Get_Impulse_Velocity_Response = LAMBDA(n_40, mass, floor_width, floor_span, | |
| LET( | |
| m, mass, | |
| b, floor_width / 10 ^ 3, | |
| L, floor_span / 10 ^ 3, | |
| (4 * (0.4 + 0.6 * n_40)) / (m * b * L + 200) | |
| ) | |
| ); | |
| Get_Instanteous_Deflection_Under_Point_load = LAMBDA( | |
| k_dist, | |
| k_amp, | |
| equivalent_length, | |
| joist_stiffness, | |
| LET( | |
| l_eq, equivalent_length, | |
| EI_J, joist_stiffness, | |
| (1000 * k_dist * l_eq ^ 3 * k_amp) / (48 * EI_J) | |
| ) | |
| ); | |
| Get_Max_Trimmer_Span = LAMBDA( | |
| span_of_joists, | |
| breadth_of_each_trimmer, | |
| depth_of_trimmer, | |
| grade_of_timber, | |
| LET( | |
| l, span_of_joists, | |
| b, breadth_of_each_trimmer, | |
| h, depth_of_trimmer, | |
| gr, IF(grade_of_timber = "C24", 1.075, 1), | |
| 0.165 * (-0.308 * l / 1000 + 3.38) * (0.0214 * b + 1.12) * (0.0149 * h - 0.073) * 1000 * gr | |
| ) | |
| ); | |
| Get_Max_Trimming_Joist_Span = LAMBDA( | |
| span_of_trimmed_joists, | |
| span_of_untrimmed_joists, | |
| span_of_supported_trimmer_beam, | |
| breadth_of_each_trimmer, | |
| depth_of_trimmer, | |
| grade_of_timber, | |
| LET( | |
| d_1, span_of_trimmed_joists, | |
| d_2, span_of_untrimmed_joists, | |
| d_3, span_of_supported_trimmer_beam, | |
| b, breadth_of_each_trimmer, | |
| h, depth_of_trimmer, | |
| gr, IF(grade_of_timber = "C24", 1.075, 1), | |
| 0.032 * (-0.31 * d_3 / 1000 + 3.8) * (-1.52 * d_1 / d_2 + 3.93) * (0.022 * b + 1.79) * | |
| (0.0196 * h - 0.16) * 1000 * gr | |
| ) | |
| ); | |
| /** | |
| Returns α | |
| */ | |
| Get_Notch_Ratio = LAMBDA(height, notch_depth, LET(h, height, h_n, notch_depth, (h - h_n) / h)); | |
| Get_Number_Of_First_Order_Modes = LAMBDA( | |
| fundamental_frequency, | |
| floor_width, | |
| floor_span, | |
| floor_stiffness_per_metre, | |
| joist_stiffness_per_metre, | |
| LET( | |
| f_1, fundamental_frequency, | |
| b, floor_width / 10 ^ 3, | |
| L, floor_span / 10 ^ 3, | |
| EI_b, floor_stiffness_per_metre / 10 ^ 6, | |
| EI_l, joist_stiffness_per_metre / 10 ^ 6, | |
| (((40 / f_1) ^ 2 - 1) * (b / L) ^ 4 * (EI_l / EI_b)) ^ 0.25 | |
| ) | |
| ); | |
| /** | |
| Aspect ratio coefficient for torsional moment of inertia. No exact formulas for non-circular cross-sections exist | |
| */ | |
| Get_Torsion_Coefficient_Beta = LAMBDA(breadth, height, | |
| LET(b, breadth, h, height, (1 / 3) - 0.21 * (b / h) * (1 - (b ^ 4) / (12 * h ^ 4))) | |
| ); | |
| Get_Torsional_Moment_Of_Inertia = LAMBDA(breadth, height, | |
| LET(b, breadth, h, height, β, Get_Torsion_Coefficient_Beta(b, h), β * h * b ^ 3) | |
| ); | |
| /** | |
| 5th percentile shear modulus derived from EC5 Eq6.31,Eq6.32 & EN 384 | |
| */ | |
| Get_G_005 = LAMBDA(material, strength_class, breadth, height, | |
| LET( | |
| b, breadth, | |
| h, height, | |
| E_005, Get_Properties_Value(strength_class, "E_005", material), | |
| β, Get_Torsion_Coefficient_Beta(b, h), | |
| α, (48 + (2 / 3)) * β, //https://blogs.napier.ac.uk/cwst/5th-percentile-shear-modulus/ | |
| IFS( | |
| material = "Softwood", | |
| E_005 / α, | |
| OR(material = "Hardwood", material = "Green_Oak"), | |
| E_005 / 16, | |
| OR(material = "Glulam", material = "LVL"), | |
| Get_Properties_Value(strength_class, "G_005", material) | |
| ) | |
| ) | |
| ); | |
| Get_Beam_Selfweight_per_m = LAMBDA(breadth, height, material, strength_class, | |
| LET( | |
| b, breadth, | |
| h, height, | |
| ρ_mean, Get_Properties_Value(strength_class, "ρ_mean", material), | |
| ρ_mean * (b / 1000) * (h / 1000) * (9.81 / 1000) | |
| ) | |
| ); | |
| Get_Shear_Stress = LAMBDA(design_shear_kN, breadth, height, material, | |
| LET( | |
| b, breadth, | |
| h, height, | |
| section_area, b * h, | |
| K_cr, Get_K_cr(material), | |
| (3 * design_shear_kN * 10 ^ 3) / (2 * section_area * K_cr) | |
| ) | |
| ); | |
| Get_Shear_Strength = LAMBDA( | |
| material, | |
| strength_class, | |
| service_class, | |
| is_load_sharing, | |
| load_duration, | |
| LET( | |
| γ_M, Get_γ_M(material), | |
| K_sys, Get_K_sys(is_load_sharing), | |
| K_mod, Get_K_mod(service_class, load_duration), | |
| f_v_k, Get_Properties_Value(strength_class, "f_v_k", material), | |
| K_mod * K_sys * f_v_k / γ_M | |
| ) | |
| ); | |
| Get_Bending_Stress = LAMBDA(breadth, height, material, design_moment_kNm, | |
| LET( | |
| b, breadth, | |
| h, height, | |
| W_el_y, Get_Elastic_Modulus(b, h), | |
| design_moment_kNm * 10 ^ 6 / W_el_y | |
| ) | |
| ); | |
| Get_Bending_Strength = LAMBDA( | |
| height, | |
| material, | |
| strength_class, | |
| service_class, | |
| is_load_sharing, | |
| load_duration, | |
| [LVL_size_factor], | |
| LET( | |
| h, height, | |
| γ_M, Get_γ_M(material), | |
| K_sys, Get_K_sys(is_load_sharing), | |
| K_mod, Get_K_mod(service_class, load_duration), | |
| K_h, IF( | |
| material = "LVL", | |
| Get_K_h(h, material, Get_Properties_Value(strength_class, "s_factor", material)), | |
| Get_K_h(h, material) | |
| ), | |
| f_m_y_k, Get_Properties_Value(strength_class, "f_m_y_k", material), | |
| K_h * K_mod * K_sys * f_m_y_k / γ_M | |
| ) | |
| ); | |
| Get_Buckling_Strength = LAMBDA( | |
| breadth, | |
| height, | |
| effective_length_mm, | |
| material, | |
| strength_class, | |
| bending_strength_kNm, | |
| LET( | |
| b, breadth, | |
| h, height, | |
| L_ef, effective_length_mm, | |
| f_m_y_k, Get_Properties_Value(strength_class, "f_m_y_k", material), | |
| σ_m_crit, Get_Critical_Bending_Stress(b, h, L_ef, strength_class, material), | |
| λ_rel_m, Get_Relative_Slenderness(f_m_y_k, σ_m_crit), | |
| K_crit, Get_K_crit(λ_rel_m), | |
| K_crit * bending_strength_kNm | |
| ) | |
| ); | |
| Get_Bearing_Stress = LAMBDA(bearing_length_mm, breadth, design_shear_kN, | |
| LET( | |
| l_b, bearing_length_mm, | |
| b, breadth, | |
| bearing_area, b * l_b, | |
| design_shear_kN * 1000 / (bearing_area) | |
| ) | |
| ); | |
| Get_Bearing_Strength = LAMBDA( | |
| material, | |
| strength_class, | |
| service_class, | |
| load_duration, | |
| [bearing_support_condition], | |
| LET( | |
| γ_M, Get_γ_M(material), | |
| K_mod, Get_K_mod(service_class, load_duration), | |
| K_c_90, IF( | |
| ISOMITTED(bearing_support_condition), | |
| Get_K_c_90(material), | |
| Get_K_c_90(material, bearing_support_condition) | |
| ), | |
| f_c_90_k, Get_Properties_Value(strength_class, "f_c_90_k", material), | |
| K_c_90 * K_mod * f_c_90_k / γ_M | |
| ) | |
| ); | |
| Get_Second_Moment_Of_Area = LAMBDA(breadth, height, LET(b, breadth, h, height, b * h ^ 3 / 12)); | |
| Get_Elastic_Modulus = LAMBDA(breadth, height, LET(b, breadth, h, height, b * h ^ 2 / 6)); | |
| /* Returns the max deflection from a UDL. | |
| Include service_class argument if instantaneous + creep required.*/ | |
| Get_Flexural_Deflection = LAMBDA( | |
| UDL_kN_per_m, | |
| length_mm, | |
| material, | |
| strength_class, | |
| breadth, | |
| height, | |
| [service_class_include_for_creep], | |
| [imposed_combination_factor], | |
| LET( | |
| UDL, UDL_kN_per_m, | |
| L, length_mm, | |
| b, breadth, | |
| h, height, | |
| ϕ_2, IF(ISOMITTED(imposed_combination_factor), 1, imposed_combination_factor), | |
| K_def, IF(ISOMITTED(service_class), 0, Get_K_def(service_class, material)), | |
| E_0_mean, Get_Properties_Value(strength_class, "E_0_mean", material), | |
| I_y, Get_Second_Moment_Of_Area(b, h), | |
| ((5 * UDL * L ^ 4) / (384 * E_0_mean * I_y)) * (1 + ϕ_2 * K_def) | |
| ) | |
| ); | |
| Get_Shear_Deflection = LAMBDA( | |
| UDL_kN_per_m, | |
| length_mm, | |
| material, | |
| strength_class, | |
| breadth, | |
| height, | |
| [service_class], | |
| [imposed_combination_factor], | |
| LET( | |
| UDL, UDL_kN_per_m, | |
| L, length_mm, | |
| b, breadth, | |
| h, height, | |
| k_form, Get_K_form(material), | |
| ϕ_2, IF(ISOMITTED(imposed_combination_factor), 1, imposed_combination_factor), | |
| K_def, IF(ISOMITTED(service_class), 0, Get_K_def(service_class, material)), | |
| G_mean, Get_Properties_Value(strength_class, "G_mean", material), | |
| I_y, Get_Second_Moment_Of_Area(b, h), | |
| ((K_form * UDL * L ^ 2) / (8 * G_mean * b * h)) * (1 + ϕ_2 * K_def) | |
| ) | |
| ); | |
| Get_Final_Deflection = LAMBDA( | |
| permanent_UDL, | |
| imposed_UDL, | |
| length_mm, | |
| material, | |
| strength_class, | |
| breadth, | |
| height, | |
| service_class, | |
| imposed_combination_factor, | |
| LET( | |
| g_k, permanent_UDL, | |
| q_k, imposed_UDL, | |
| L, length_mm, | |
| b, breadth, | |
| h, height, | |
| ϕ_2, imposed_combination_factor, | |
| δ_flex_g, Get_Flexural_Deflection(g_k, L, material, strength_class, b, h, service_class), | |
| δ_flex_q, Get_Flexural_Deflection( | |
| q_k, | |
| L, | |
| material, | |
| strength_class, | |
| b, | |
| h, | |
| service_class, | |
| ϕ_2 | |
| ), | |
| δ_v_g, Get_Shear_Deflection(g_k, L, material, strength_class, b, h, service_class), | |
| δ_v_q, Get_Shear_Deflection(q_k, L, material, strength_class, b, h, service_class, ϕ_2), | |
| SUM(δ_flex_g, δ_flex_q, δ_v_g, δ_v_q) | |
| ) | |
| ); | |
| /** | |
| Auto designs timber beam size to smallest depth through a list of standard breadths & depths | |
| */ | |
| Get_Auto_Designed_Timber_Size_List = LAMBDA( | |
| service_class, | |
| load_duration, | |
| is_load_sharing, | |
| strength_class, | |
| material, | |
| permanent_UDL, | |
| imposed_UDL, | |
| is_restrained, | |
| length_mm, | |
| effective_length_factor, | |
| imposed_combination_factor, | |
| deflection_limit, | |
| [b_index], | |
| [h_index], | |
| LET( | |
| L, length_mm, | |
| K_ef, effective_length_factor, | |
| ϕ_2, imposed_combination_factor, | |
| δ_lim, deflection_limit, | |
| L_ef, K_ef * L, | |
| b_index, IF(ISOMITTED(b_index), 1, b_index), | |
| h_index, IF(ISOMITTED(h_index), 1, h_index), | |
| breadths, IFS( | |
| material = "Softwood", | |
| {38, 47, 63, 75}, | |
| material = "Hardwood", | |
| {38, 52, 63, 75, 100, 125, 150}, | |
| AND(material = "Glulam", h_index <= 4), | |
| {65, 90, 115, 140}, | |
| AND(material = "Glulam", h_index <= 5), | |
| {90, 115, 140}, | |
| AND(material = "Glulam", h_index <= 7), | |
| {90, 115, 140, 165}, | |
| AND(material = "Glulam", h_index <= 8), | |
| {115, 140, 165, 190}, | |
| AND(material = "Glulam", h_index > 8), | |
| {140, 165, 190}, | |
| material = "LVL", | |
| {27, 33, 39, 45, 51, 57, 63, 75}, | |
| AND(material = "Green_Oak", h_index <= 5), | |
| {50, 75, 100, 125, 150}, | |
| AND(material = "Green_Oak", h_index > 5), | |
| {100, 125, 150, 175, 200, 225, 250} | |
| ), | |
| b_max, COUNT(breadths), | |
| b, INDEX(breadths, b_index), | |
| heights, IFS( | |
| material = "Softwood", | |
| {75, 100, 120, 150, 175, 200, 225, 250, 300}, | |
| material = "Hardwood", | |
| {50, 60, 70, 80, 90, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300}, | |
| AND(b <= 65, material = "Glulam"), | |
| {225, 270, 315, 360}, | |
| AND(b <= 90, material = "Glulam"), | |
| {225, 270, 315, 360, 405, 450, 495}, | |
| AND(b <= 115, material = "Glulam"), | |
| {225, 270, 315, 360, 405, 450, 495, 540}, | |
| AND(b >= 140, material = "Glulam"), | |
| {225, 270, 315, 360, 405, 450, 495, 540, 585, 630, 675}, | |
| material = "LVL", | |
| {200, 260, 300, 360, 400, 450, 500, 600, 900, 1800}, | |
| material = "Green_Oak", | |
| {100, 125, 150, 175, 200, 225, 250, 275, 300} | |
| ), | |
| h_max, COUNT(heights), | |
| h, INDEX(heights, h_index), | |
| b_index_next, IF(b_index = b_max, 1, b_index + 1), | |
| h_index_next, IF(b_index = b_max, h_index + 1, h_index), | |
| g_swt, Get_Beam_Selfweight_per_m(b, h, material, strength_class), | |
| g_k, permanent_UDL, | |
| g_kt, SUM(g_k, g_swt), | |
| q_k, imposed_UDL, | |
| // Bending | |
| design_moment_kNm, Loading.Get_Design_Bending_Moment(g_kt, q_k, L), | |
| bending_stress, Get_Bending_Stress(b, h, material, design_moment_kNm), | |
| bending_strength, Get_Bending_Strength( | |
| h, | |
| material, | |
| strength_class, | |
| service_class, | |
| is_load_sharing, | |
| load_duration | |
| ), | |
| bending_UR, bending_stress / bending_strength, | |
| // Shear | |
| shear_strength, Get_Shear_Strength( | |
| material, | |
| strength_class, | |
| service_class, | |
| is_load_sharing, | |
| load_duration | |
| ), | |
| design_shear_kN, Loading.Get_Design_Shear_Force(g_kt, q_k, L), | |
| shear_stress, Get_Shear_Stress(design_shear_kN, b, h, material), | |
| shear_UR, shear_stress / shear_strength, | |
| // LTB | |
| buckling_strength, Get_Buckling_Strength( | |
| b, | |
| h, | |
| L_ef, | |
| material, | |
| strength_class, | |
| bending_strength | |
| ), | |
| LTB_UR, IF(OR(b >= h, is_restrained), "Not Req'd", bending_stress / buckling_strength), | |
| // | |
| buckling_strength_next, Get_Buckling_Strength( | |
| b, | |
| h + 5, | |
| L_ef, | |
| material, | |
| strength_class, | |
| bending_strength | |
| ), | |
| LTB_UR_next, IF( | |
| OR(b >= h, is_restrained), | |
| "Not Req'd", | |
| bending_stress / buckling_strength_next | |
| ), | |
| // Deflection | |
| δ_fin, Get_Final_Deflection( | |
| g_kt, | |
| q_k, | |
| L, | |
| material, | |
| strength_class, | |
| b, | |
| h, | |
| service_class, | |
| ϕ_2 | |
| ), | |
| δ_UR, δ_fin / δ_lim, | |
| // | |
| results, VSTACK(h, bending_UR, shear_UR, LTB_UR, δ_UR), | |
| // | |
| IF( | |
| AND(bending_UR < 1, shear_UR < 1, δ_UR < 1), | |
| IF( | |
| OR(is_restrained, LTB_UR = "Not Req'd"), | |
| results, | |
| IF( | |
| OR(LTB_UR < 1, LTB_UR_next > LTB_UR), // as h increases LTB gets worse | |
| results, | |
| IF( | |
| AND(b_index = b_max, h_index = h_max), | |
| results, | |
| Get_Auto_Designed_Timber_Size_List( | |
| service_class, | |
| load_duration, | |
| is_load_sharing, | |
| strength_class, | |
| material, | |
| g_k, | |
| q_k, | |
| is_restrained, | |
| L, | |
| K_ef, | |
| ϕ_2, | |
| δ_lim, | |
| b_index_next, | |
| h_index_next | |
| ) | |
| ) | |
| ) | |
| ), | |
| IF( | |
| AND(b_index = b_max, h_index = h_max), | |
| results, | |
| Get_Auto_Designed_Timber_Size_List( | |
| service_class, | |
| load_duration, | |
| is_load_sharing, | |
| strength_class, | |
| material, | |
| g_k, | |
| q_k, | |
| is_restrained, | |
| L, | |
| K_ef, | |
| ϕ_2, | |
| δ_lim, | |
| b_index_next, | |
| h_index_next | |
| ) | |
| ) | |
| ) | |
| ) | |
| ); | |
| /** | |
| Auto designs timber beam size to smallest depth for a given breadth | |
| */ | |
| Get_Auto_Designed_Timber_Size_Depth = LAMBDA( | |
| service_class, | |
| load_duration, | |
| is_load_sharing, | |
| strength_class, | |
| material, | |
| permanent_UDL, | |
| imposed_UDL, | |
| is_restrained, | |
| length_mm, | |
| effective_length_factor, | |
| imposed_combination_factor, | |
| deflection_limit, | |
| breadth, | |
| [height], | |
| LET( | |
| L, length_mm, | |
| K_ef, effective_length_factor, | |
| ϕ_2, imposed_combination_factor, | |
| δ_lim, deflection_limit, | |
| L_ef, K_ef * L, | |
| b, breadth, | |
| h, IF(ISOMITTED(height), 75, height), | |
| g_swt, Get_Beam_Selfweight_per_m(b, h, material, strength_class), | |
| g_k, permanent_UDL, | |
| g_kt, SUM(g_k, g_swt), | |
| q_k, imposed_UDL, | |
| h_next, h + 5, // change value of iteration here | |
| // Bending | |
| design_moment_kNm, Loading.Get_Design_Bending_Moment(g_kt, q_k, L), | |
| bending_stress, Get_Bending_Stress(b, h, material, design_moment_kNm), | |
| bending_strength, Get_Bending_Strength( | |
| h, | |
| material, | |
| strength_class, | |
| service_class, | |
| is_load_sharing, | |
| load_duration | |
| ), | |
| bending_UR, bending_stress / bending_strength, | |
| // Shear | |
| shear_strength, Get_Shear_Strength( | |
| material, | |
| strength_class, | |
| service_class, | |
| is_load_sharing, | |
| load_duration | |
| ), | |
| design_shear_kN, Loading.Get_Design_Shear_Force(g_kt, q_k, L), | |
| shear_stress, Get_Shear_Stress(design_shear_kN, b, h, material), | |
| shear_UR, shear_stress / shear_strength, | |
| // LTB | |
| buckling_strength, Get_Buckling_Strength( | |
| b, | |
| h, | |
| L_ef, | |
| material, | |
| strength_class, | |
| bending_strength | |
| ), | |
| LTB_UR, IF(OR(b >= h, is_restrained), "Not Req'd", bending_stress / buckling_strength), | |
| // | |
| buckling_strength_next, Get_Buckling_Strength( | |
| b, | |
| h + 5, | |
| L_ef, | |
| material, | |
| strength_class, | |
| bending_strength | |
| ), | |
| LTB_UR_next, IF( | |
| OR(b >= h, is_restrained), | |
| "Not Req'd", | |
| bending_stress / buckling_strength_next | |
| ), | |
| // Deflection | |
| δ_fin, Get_Final_Deflection( | |
| g_kt, | |
| q_k, | |
| L, | |
| material, | |
| strength_class, | |
| b, | |
| h, | |
| service_class, | |
| ϕ_2 | |
| ), | |
| δ_UR, δ_fin / δ_lim, | |
| // | |
| results, VSTACK(h, bending_UR, shear_UR, LTB_UR, δ_UR), | |
| // | |
| IF( | |
| AND(bending_UR < 1, shear_UR < 1, δ_UR < 1), | |
| IF( | |
| OR(is_restrained, LTB_UR = "Not Req'd"), | |
| results, | |
| IF( | |
| OR(LTB_UR < 1, LTB_UR_next > LTB_UR), // as h increases LTB gets worse | |
| results, | |
| Get_Auto_Designed_Timber_Size_Depth( | |
| service_class, | |
| load_duration, | |
| is_load_sharing, | |
| strength_class, | |
| material, | |
| g_k, | |
| q_k, | |
| is_restrained, | |
| L, | |
| K_ef, | |
| ϕ_2, | |
| δ_lim, | |
| b, | |
| h_next | |
| ) | |
| ) | |
| ), | |
| Get_Auto_Designed_Timber_Size_Depth( | |
| service_class, | |
| load_duration, | |
| is_load_sharing, | |
| strength_class, | |
| material, | |
| g_k, | |
| q_k, | |
| is_restrained, | |
| L, | |
| K_ef, | |
| ϕ_2, | |
| δ_lim, | |
| b, | |
| h_next | |
| ) | |
| ) | |
| ) | |
| ); | |
| /** | |
| Auto designs timber beam size to smallest breadth for a given depth | |
| */ | |
| Get_Auto_Designed_Timber_Size_Breadth = LAMBDA( | |
| service_class, | |
| load_duration, | |
| is_load_sharing, | |
| strength_class, | |
| material, | |
| permanent_UDL, | |
| imposed_UDL, | |
| is_restrained, | |
| length_mm, | |
| effective_length_factor, | |
| imposed_combination_factor, | |
| deflection_limit, | |
| height, | |
| [breadth], | |
| LET( | |
| L, length_mm, | |
| K_ef, effective_length_factor, | |
| ϕ_2, imposed_combination_factor, | |
| δ_lim, deflection_limit, | |
| L_ef, K_ef * L, | |
| h, height, | |
| b, IF(ISOMITTED(breadth), 40, breadth), | |
| b_next, b + 5, // change value of iteration here | |
| g_swt, Get_Beam_Selfweight_per_m(b, h, material, strength_class), | |
| g_k, permanent_UDL, | |
| g_kt, SUM(g_k, g_swt), | |
| q_k, imposed_UDL, | |
| // Bending | |
| design_moment_kNm, Loading.Get_Design_Bending_Moment(g_kt, q_k, L), | |
| bending_stress, Get_Bending_Stress(b, h, material, design_moment_kNm), | |
| bending_strength, Get_Bending_Strength( | |
| h, | |
| material, | |
| strength_class, | |
| service_class, | |
| is_load_sharing, | |
| load_duration | |
| ), | |
| bending_UR, bending_stress / bending_strength, | |
| // Shear | |
| shear_strength, Get_Shear_Strength( | |
| material, | |
| strength_class, | |
| service_class, | |
| is_load_sharing, | |
| load_duration | |
| ), | |
| design_shear_kN, Loading.Get_Design_Shear_Force(g_kt, q_k, L), | |
| shear_stress, Get_Shear_Stress(design_shear_kN, b, h, material), | |
| shear_UR, shear_stress / shear_strength, | |
| // LTB | |
| buckling_strength, Get_Buckling_Strength( | |
| b, | |
| h, | |
| L_ef, | |
| material, | |
| strength_class, | |
| bending_strength | |
| ), | |
| LTB_UR, IF(OR(b >= h, is_restrained), "Not Req'd", bending_stress / buckling_strength), | |
| // Deflection | |
| δ_fin, Get_Final_Deflection( | |
| g_kt, | |
| q_k, | |
| L, | |
| material, | |
| strength_class, | |
| b, | |
| h, | |
| service_class, | |
| ϕ_2 | |
| ), | |
| δ_UR, δ_fin / δ_lim, | |
| // | |
| results, VSTACK(h, bending_UR, shear_UR, LTB_UR, δ_UR), | |
| // | |
| IF( | |
| AND(bending_UR < 1, shear_UR < 1, δ_UR < 1), | |
| IF( | |
| OR(is_restrained, LTB_UR = "Not Req'd"), | |
| results, | |
| IF( | |
| LTB_UR < 1, | |
| results, | |
| Get_Auto_Designed_Timber_Size_Breadth( | |
| service_class, | |
| load_duration, | |
| is_load_sharing, | |
| strength_class, | |
| material, | |
| g_k, | |
| q_k, | |
| is_restrained, | |
| L, | |
| K_ef, | |
| ϕ_2, | |
| δ_lim, | |
| h, | |
| b_next | |
| ) | |
| ) | |
| ), | |
| Get_Auto_Designed_Timber_Size_Breadth( | |
| service_class, | |
| load_duration, | |
| is_load_sharing, | |
| strength_class, | |
| material, | |
| g_k, | |
| q_k, | |
| is_restrained, | |
| L, | |
| K_ef, | |
| ϕ_2, | |
| δ_lim, | |
| h, | |
| b_next | |
| ) | |
| ) | |
| ) | |
| ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment