test "simply supported beam - point load" {
// P=10kN at mid-span, L=4m
let (ra, rb) = simply_supported_reactions_point(10.0, 2.0, 4.0)
assert_eq(ra, 5.0)
assert_eq(rb, 5.0)
}
test "simply supported beam - uniform load" {
// q=5kN/m, L=6m
let (ra, rb) = simply_supported_reactions_uniform(5.0, 6.0)
assert_eq(ra, 15.0)
assert_eq(rb, 15.0)
}
test "cantilever reactions" {
// P=8kN at end, L=3m
let (v, m) = cantilever_reactions_point(8.0, 3.0)
assert_eq(v, 8.0)
assert_eq(m, 24.0)
// q=4kN/m, L=5m
let (v2, m2) = cantilever_reactions_uniform(4.0, 5.0)
assert_eq(v2, 20.0)
assert_eq(m2, 50.0)
}test "internal forces - simply supported" {
// P=10kN at 2m from left, L=5m
let v_left = simply_supported_shear_point(10.0, 2.0, 5.0, 1.0)
assert_eq(v_left, 6.0)
let v_right = simply_supported_shear_point(10.0, 2.0, 5.0, 3.0)
assert_eq(v_right, -4.0)
let m_at_load = simply_supported_moment_point(10.0, 2.0, 5.0, 2.0)
assert_eq(m_at_load, 12.0)
}
test "section properties" {
// Rectangular section: b=0.3m, h=0.5m
let i_rect = rect_inertia(0.3, 0.5)
assert_eq(approx_equal(i_rect, 0.003125, 0.000001), true)
let w_rect = rect_section_modulus(0.3, 0.5)
assert_eq(approx_equal(w_rect, 0.0125, 0.000001), true)
}
test "deflection calculations" {
// Simply supported beam, point load at mid-span
// δ = PL³/(48EI)
let d1 = simply_supported_deflection_point_mid(10.0, 4.0, 200.0, 0.001)
assert_eq(approx_equal(d1, 66.667, 0.01), true)
}test "euler critical force" {
// E=200GPa, I=0.0001m⁴, L=5m, μ=1 (both ends hinged)
// Pcr = π²EI/(μL)² = 7.895 MN
let pcr = euler_critical_force(200.0e9, 0.0001, 5.0, 1.0)
assert_eq(approx_equal(pcr / 1.0e6, 7.895, 0.01), true)
}
test "stability factor - Q235 steel" {
let phi = stability_factor_steel_q235(50.0)
assert_eq(phi > 0.0, true)
}
test "dynamics" {
// Natural frequency: k=1000N/m, m=10kg
let omega = natural_frequency(1000.0, 10.0)
assert_eq(omega, 10.0)
// Damping ratio: c=40, k=1000, m=10
let xi = damping_ratio(40.0, 1000.0, 10.0)
assert_eq(approx_equal(xi, 0.2, 0.0001), true)
}test "truss analysis" {
// Triangle truss: L=4m, h=3m, P=10kN
let (n_left, n_right, n_bottom) = truss_triangle(4.0, 3.0, 10.0)
assert_eq(approx_equal(n_left, -6.010, 0.01), true)
assert_eq(approx_equal(n_right, -6.010, 0.01), true)
assert_eq(approx_equal(n_bottom, 3.336, 0.01), true)
}
test "rotational stiffness" {
// Rotational stiffness (far end fixed)
let s_fixed = rotational_stiffness(200.0, 0.001, 4.0, true)
assert_eq(s_fixed, 0.2)
// Rotational stiffness (far end hinged)
let s_hinged = rotational_stiffness(200.0, 0.001, 4.0, false)
assert_eq(s_hinged, 0.15)
}
test "three moment equation" {
let coeffs = three_moment_coefficients(4.0, 6.0)
assert_eq(coeffs.0, 4.0)
}test "basic math tools" {
assert_eq(square(3.0), 9.0)
assert_eq(cube(2.0), 8.0)
assert_eq(abs(-5.0), 5.0)
assert_eq(max(3.0, 5.0), 5.0)
assert_eq(min(3.0, 5.0), 3.0)
}
test "vector operations" {
// Dot product
assert_eq(dot2d(1.0, 0.0, 0.0, 1.0), 0.0)
assert_eq(dot2d(1.0, 2.0, 3.0, 4.0), 11.0)
// Cross product (2D)
assert_eq(cross2d(1.0, 0.0, 0.0, 1.0), 1.0)
// Distance
assert_eq(distance2d(0.0, 0.0, 3.0, 4.0), 5.0)
}
test "determinants" {
// 2x2 determinant
assert_eq(det2x2(1.0, 2.0, 3.0, 4.0), -2.0)
// 3x3 determinant
assert_eq(det3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0), 1.0)
}
test "solve linear systems" {
// 2x2 system: x + 2y = 5, 3x + 4y = 11
let (x, y) = solve2x2(1.0, 2.0, 3.0, 4.0, 5.0, 11.0)
assert_eq(approx_equal(x, 1.0, 0.0001), true)
assert_eq(approx_equal(y, 2.0, 0.0001), true)
}
test "polygon area" {
// Square 2x2
let sq = [(0.0, 0.0), (2.0, 0.0), (2.0, 2.0), (0.0, 2.0)]
assert_eq(polygon_area(sq), 4.0)
// Triangle
let tri = [(0.0, 0.0), (4.0, 0.0), (2.0, 3.0)]
assert_eq(polygon_area(tri), 6.0)
}test "force method" {
// Single redundant: δ₁p = 5, δ₁₁ = 2
let x1 = force_method_1_redundant(5.0, 2.0)
assert_eq(x1, -2.5)
// Two redundants
let (x1, x2) = force_method_2_redundant(1.0, 0.0, 1.0, 5.0, 3.0)
assert_eq(approx_equal(x1, -5.0, 0.001), true)
assert_eq(approx_equal(x2, -3.0, 0.001), true)
}
test "displacement method" {
// Rotational stiffness (far end fixed)
let s_fixed = rotational_stiffness(200.0, 0.001, 4.0, true)
assert_eq(s_fixed, 0.2)
// Linear stiffness
let s_linear = linear_stiffness(200.0, 0.001, 4.0)
assert_eq(s_linear, 0.05)
}test "influence lines" {
// Support reactions
let eta_ra = influence_line_ra(2.0, 5.0)
assert_eq(eta_ra, 0.6)
let eta_rb = influence_line_rb(2.0, 5.0)
assert_eq(eta_rb, 0.4)
// Moment influence line (section at mid-span)
let eta_m = influence_line_moment(4.0, 4.0, 10.0)
assert_eq(eta_m, 2.4)
}moon testfn axial_strain_energy(n : Double, l : Double, e : Double, a : Double) -> Doublefn beam_frequency_concentrated_mass(e : Double, i : Double, m : Double, l : Double) -> Doublefn beam_frequency_distributed_mass(e : Double, i : Double, rho_a : Double, l : Double) -> Doublefn bending_strain_energy(m : Double, l : Double, e : Double, i : Double) -> Doublefn cantilever_deflection_point_end(p : Double, l : Double, e : Double, i : Double) -> Doublefn cantilever_deflection_uniform_end(q : Double, l : Double, e : Double, i : Double) -> Doublefn cantilever_frequency_tip_mass(e : Double, i : Double, m : Double, l : Double) -> Doublefn cantilever_moment_point(p : Double, l : Double, x : Double) -> Doublefn cantilever_moment_uniform(q : Double, l : Double, x : Double) -> Doublefn cantilever_reactions_point(p : Double, l : Double) -> (Double, Double)fn cantilever_reactions_uniform(q : Double, l : Double) -> (Double, Double)fn cantilever_shear_point(p : Double, l : Double, x : Double) -> Doublefn cantilever_shear_uniform(q : Double, l : Double, x : Double) -> Doublefn cantilever_slope_point_end(p : Double, l : Double, e : Double, i : Double) -> Doublefn carryover_factor(far_end_fixed : Bool) -> Doublefn carryover_moment(distributed : Double, carryover : Double) -> Doublefn castigliano_bending_contribution(m : Double, dm_dp : Double, l : Double, e : Double, i : Double) -> Doublefn circular_arch_radius(l : Double, f : Double) -> Doublefn column_lateral_stiffness(e : Double, i : Double, h : Double, mu : Double) -> Doublefn continuous_beam_2span_uniform_mid_moment(q : Double, l : Double) -> Doublefn continuous_beam_3span_uniform_support_moment(q : Double, l : Double) -> Doublefn critical_slenderness(e : Double, sigma_p : Double) -> Doublefn cross2d(x1 : Double, y1 : Double, x2 : Double, y2 : Double) -> Doublefn damped_frequency(omega : Double, xi : Double) -> Doublefn damping_ratio(c : Double, k : Double, m : Double) -> Doublefn det2x2(a : Double, b : Double, c : Double, d : Double) -> Doublefn det3x3(a : Double, b : Double, c : Double, d : Double, e : Double, f : Double, g : Double, h : Double, i : Double) -> Doublefn effect_from_influence_area(q : Double, omega : Double) -> Doublefn euler_critical_force(e : Double, i : Double, l : Double, mu : Double) -> Doublefn euler_critical_stress(e : Double, lambda : Double) -> Doublefn fixed_end_moment_point(p : Double, a : Double, l : Double) -> (Double, Double)fn fixed_end_moment_point_mid(p : Double, l : Double) -> (Double, Double)fn fixed_end_moment_triangular(q_max : Double, l : Double) -> (Double, Double)fn fixed_end_moment_uniform(q : Double, l : Double) -> (Double, Double)fn force_method_1_redundant(delta_1p : Double, delta_11 : Double) -> Doublefn force_method_2_redundant(d11 : Double, d12 : Double, d22 : Double, d1p : Double, d2p : Double) -> (Double, Double)fn graph_multiply_para_tri(m_para : Double, m_tri : Double, l : Double) -> Doublefn graph_multiply_rects(m1 : Double, m2 : Double, l : Double) -> Doublefn graph_multiply_tri_rect(m_tri : Double, m_rect : Double, l : Double) -> Doublefn graph_multiply_triangles(m1 : Double, m2 : Double, l : Double) -> Doublefn hollow_circle_inertia(r_outer : Double, r_inner : Double) -> Doublefn hollow_rect_inertia(b_outer : Double, h_outer : Double, b_inner : Double, h_inner : Double) -> Doublefn i_section_inertia(b : Double, h : Double, tf : Double, tw : Double) -> Doublefn influence_area_triangle(base : Double, height : Double) -> Doublefn influence_line_moment(x : Double, a : Double, l : Double) -> Doublefn influence_line_ra(x : Double, l : Double) -> Doublefn influence_line_rb(x : Double, l : Double) -> Doublefn influence_line_shear(x : Double, a : Double, l : Double) -> Doublefn inv2x2(a : Double, b : Double, c : Double, d : Double) -> (Double, Double, Double, Double)fn linear_stiffness(e : Double, i : Double, l : Double) -> Doublefn mat2x2_vec(a : Double, b : Double, c : Double, d : Double, x : Double, y : Double) -> (Double, Double)fn natural_frequency(k : Double, m : Double) -> Doublefn natural_period(k : Double, m : Double) -> Doublefn overhanging_reactions_uniform(q : Double, l : Double, a : Double, b : Double) -> (Double, Double)fn parabolic_arch_slope(x : Double, l : Double, f : Double) -> Doublefn parabolic_arch_y(x : Double, l : Double, f : Double) -> Doublefn poly2_eval(a : Double, b : Double, c : Double, x : Double) -> Doublefn poly3_eval(a : Double, b : Double, c : Double, d : Double, x : Double) -> Doublefn portal_frame_lateral_stiffness_fixed(e : Double, i_c : Double, h : Double) -> Doublefn portal_frame_lateral_stiffness_hinged(e : Double, i_c : Double, h : Double) -> Doublefn radius_of_gyration(inertia : Double, area : Double) -> Doublefn rect_section_modulus(b : Double, h : Double) -> Doublefn rotate2d(x : Double, y : Double, angle_rad : Double) -> (Double, Double)fn rotational_stiffness(e : Double, i : Double, l : Double, far_end_fixed : Bool) -> Doublefn shear_strain_energy(v : Double, l : Double, g : Double, a : Double, kappa : Double) -> Doublefn simply_supported_deflection_point_mid(p : Double, l : Double, e : Double, i : Double) -> Doublefn simply_supported_deflection_uniform_mid(q : Double, l : Double, e : Double, i : Double) -> Doublefn simply_supported_max_moment_uniform(q : Double, l : Double) -> Doublefn simply_supported_moment_point(p : Double, a : Double, l : Double, x : Double) -> Doublefn simply_supported_moment_uniform(q : Double, l : Double, x : Double) -> Doublefn simply_supported_reactions_point(p : Double, a : Double, l : Double) -> (Double, Double)fn simply_supported_reactions_triangular(q_max : Double, l : Double) -> (Double, Double)fn simply_supported_reactions_uniform(q : Double, l : Double) -> (Double, Double)fn simply_supported_shear_point(p : Double, a : Double, l : Double, x : Double) -> Doublefn simply_supported_shear_uniform(q : Double, l : Double, x : Double) -> Doublefn simply_supported_slope_uniform_end(q : Double, l : Double, e : Double, i : Double) -> Doublefn simpson_integral(fa : Double, fmid : Double, fb : Double, length : Double) -> Doublefn slenderness_ratio(length : Double, mu : Double, inertia : Double, area : Double) -> Doublefn solve2x2(a : Double, b : Double, c : Double, d : Double, e : Double, f : Double) -> (Double, Double)fn solve3x3(a11 : Double, a12 : Double, a13 : Double, a21 : Double, a22 : Double, a23 : Double, a31 : Double, a32 : Double, a33 : Double, b1 : Double, b2 : Double, b3 : Double) -> (Double, Double, Double)fn stability_capacity(phi : Double, area : Double, f : Double) -> Doublefn stability_factor_steel_q235(lambda : Double) -> Doublefn three_hinged_arch_thrust_point_mid(p : Double, l : Double, f : Double) -> Doublefn three_hinged_arch_thrust_uniform(q : Double, l : Double, f : Double) -> Doublefn three_moment_coefficients(l_left : Double, l_right : Double) -> (Double, Double, Double)fn three_moment_rhs_uniform(q_left : Double, l_left : Double, q_right : Double, l_right : Double) -> Doublefn torsion_strain_energy(t : Double, l : Double, g : Double, ip : Double) -> Doublefn transformed_area(ac : Double, as_ : Double, alpha_e : Double) -> Doublefn transformed_inertia(ic : Double, as_ : Double, alpha_e : Double, d : Double, x : Double) -> Doublefn translate2d(x : Double, y : Double, dx : Double, dy : Double) -> (Double, Double)fn trapezoid_integral(fa : Double, fb : Double, length : Double) -> Doublefn triangle_area_coords(x1 : Double, y1 : Double, x2 : Double, y2 : Double, x3 : Double, y3 : Double) -> Doublefn triangle_area_heron(a : Double, b : Double, c : Double) -> Doublefn truss_joint_2bars(fx : Double, fy : Double, angle1_deg : Double, angle2_deg : Double) -> (Double, Double)fn truss_triangle(l : Double, h : Double, p : Double) -> (Double, Double, Double)fn virtual_work_axial(n_actual : Double, n_virtual : Double, l : Double, e : Double, a : Double) -> Doublefn virtual_work_bending(m_actual : Double, m_virtual : Double, l : Double, e : Double, i : Double) -> Doublefn virtual_work_shear(v_actual : Double, v_virtual : Double, l : Double, g : Double, a : Double, kappa : Double) -> DoubleInstall
Download zip