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 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