test "rankine earth pressure" {
// Rankine active earth pressure coefficient: φ=30°
// K_a = tan²(45° - 30°/2) = tan²(30°) = 0.333
let ka = rankine_active_coefficient(30.0)
assert_eq(approx_equal(ka, 0.333, 0.01), true)
// Rankine passive earth pressure coefficient: φ=30°
// K_p = tan²(45° + 30°/2) = tan²(60°) = 3.0
let kp = rankine_passive_coefficient(30.0)
assert_eq(approx_equal(kp, 3.0, 0.1), true)
// Active earth pressure: K_a=0.333, γ=18kN/m³, z=3m
// σ_a = 0.333*18*3 = 18 kPa
let pa = rankine_active_pressure(0.333, 18.0, 3.0)
assert_eq(approx_equal(pa, 18.0, 0.5), true)
// Active earth pressure resultant force: H=5m
// E_a = 0.5*0.333*18*5² = 75 kN/m
let ea = rankine_active_force(0.333, 18.0, 5.0)
assert_eq(approx_equal(ea, 75.0, 1.0), true)
}test "bearing capacity" {
// Terzaghi bearing capacity factors: φ=30°
let nc = terzaghi_nc(30.0)
assert_eq(nc > 0.0, true)
let nq = terzaghi_nq(30.0)
assert_eq(nq > 1.0, true)
let ngamma = terzaghi_ngamma(30.0)
assert_eq(ngamma > 0.0, true)
// Terzaghi ultimate bearing capacity: c=10kPa, q=20kPa, γ=18kN/m³, B=2m, φ=30°
let qu = terzaghi_bearing_capacity(10.0, 20.0, 18.0, 2.0, 30.0)
assert_eq(qu > 0.0, true)
// Allowable bearing capacity: F_s=3.0
let fd = bearing_capacity_design(qu, 3.0)
assert_eq(approx_equal(fd, qu / 3.0, 0.1), true)
}test "settlement" {
// Single layer settlement: a_v=0.5MPa⁻¹, e_0=0.8, σ_z=100kPa, H_i=2m
// s_i = 0.5*100*2/(1+0.8) = 55.6 mm
let si = settlement_layer(0.5, 0.8, 100.0, 2.0)
assert_eq(approx_equal(si * 1000.0, 55.6, 1.0), true)
// Settlement using compression modulus: E_s=5MPa, σ_z=100kPa, H_i=2m
// s_i = (100/1000)*2/5 = 0.1*2/5 = 0.04 m = 40 mm
let si2 = settlement_layer_es(5.0, 100.0, 2.0)
assert_eq(approx_equal(si2 * 1000.0, 40.0, 1.0), true)
}test "seepage" {
// Darcy velocity: k=1e-5 m/s, i=0.1
// v = 1e-5*0.1 = 1e-6 m/s
let v = darcy_velocity(1.0e-5, 0.1)
assert_eq(approx_equal(v, 1.0e-6, 1.0e-8), true)
// Darcy flow rate: k=1e-4, i=0.2, A=10m²
// Q = 1e-4*0.2*10 = 0.0002 m³/s
let q = darcy_flow_rate(1.0e-4, 0.2, 10.0)
assert_eq(approx_equal(q, 0.0002, 0.00001), true)
// Hydraulic gradient: Δh=2m, L=10m
// i = 2/10 = 0.2
let i = hydraulic_gradient(2.0, 10.0)
assert_eq(i, 0.2)
// Critical hydraulic gradient: G_s=2.65, e=0.8
// i_cr = (2.65-1)/(1+0.8) = 0.917
let icr = critical_hydraulic_gradient(2.65, 0.8)
assert_eq(approx_equal(icr, 0.917, 0.01), true)
// Check for piping
assert_eq(is_piping(1.0, 0.917), true)
assert_eq(is_piping(0.5, 0.917), false)
}test "consolidation" {
// Time factor: C_v=1e-8 m²/s, t=1年=3.15e7s, H=5m
// T_v = 1e-8*3.15e7/25 = 0.0126
let tv = time_factor(1.0e-8, 3.15e7, 5.0)
assert_eq(approx_equal(tv, 0.0126, 0.001), true)
// Degree of consolidation: T_v=0.1
// U ≈ 2√(0.1/π) = 0.357
let u1 = consolidation_degree(0.1)
assert_eq(approx_equal(u1, 0.357, 0.05), true)
// Final consolidation settlement: m_v=0.5MPa⁻¹, σ_z=100kPa, H=3m
// s_f = m_v * (σ_z/1000) * H = 0.5 * 0.1 * 3 = 0.15 m = 150 mm
let sf = consolidation_settlement_final(0.5, 100.0, 3.0)
assert_eq(approx_equal(sf * 1000.0, 150.0, 1.0), true)
}test "soil properties" {
// Void ratio: n=0.5
// e = 0.5/(1-0.5) = 1.0
let e = void_ratio(0.5)
assert_eq(e, 1.0)
// Porosity: e=0.8
// n = 0.8/(1+0.8) = 0.444
let n = porosity(0.8)
assert_eq(approx_equal(n, 0.444, 0.01), true)
// Degree of saturation: V_w=0.4, V_v=0.5
// S_r = 0.4/0.5*100 = 80%
let sr = degree_of_saturation(0.4, 0.5)
assert_eq(approx_equal(sr, 80.0, 1.0), true)
// Dry density: ρ=1800kg/m³, w=20%
// ρ_d = 1800/(1+0.2) = 1500 kg/m³
let rho_d = dry_density(1800.0, 20.0)
assert_eq(approx_equal(rho_d, 1500.0, 10.0), true)
}moon testfn additional_stress_center(p : Double, ic : Double) -> Doublefn at_rest_coefficient(phi_deg : Double) -> Doublefn at_rest_pressure(k0 : Double, gamma : Double, z : Double) -> Doublefn bearing_capacity_design(qu : Double, fs : Double) -> Doublefn bishop_safety_factor_iteration(c : Double, phi_deg : Double, slices : Array[(Double, Double, Double)], fs_initial : Double) -> Doublefn consolidation_coefficient(k : Double, mv : Double, gamma_w : Double) -> Doublefn consolidation_degree(tv : Double) -> Doublefn consolidation_settlement_final(mv : Double, sigma_z : Double, h : Double) -> Doublefn consolidation_settlement_time(u : Double, sf : Double) -> Doublefn coulomb_active_coefficient(phi_deg : Double, alpha_deg : Double, beta_deg : Double, delta_deg : Double) -> Doublefn coulomb_active_force(ka : Double, gamma : Double, h : Double) -> Doublefn critical_hydraulic_gradient(gs : Double, e : Double) -> Doublefn darcy_flow_rate(k : Double, i : Double, a : Double) -> Doublefn darcy_velocity(k : Double, i : Double) -> Doublefn degree_of_saturation(vw : Double, vv : Double) -> Doublefn dry_density(rho : Double, w : Double) -> Doublefn earth_pressure_force_position_with_surcharge(h : Double, q : Double, gamma : Double) -> Doublefn earth_pressure_type(ka : Double, kp : Double, k0 : Double, k_actual : Double) -> Stringfn effective_stress(sigma : Double, u : Double) -> Doublefn hydraulic_gradient(delta_h : Double, l : Double) -> Doublefn permeability_from_d10(d10 : Double, c : Double) -> Doublefn pore_water_pressure(gamma_w : Double, hw : Double) -> Doublefn rankine_active_coefficient(phi_deg : Double) -> Doublefn rankine_active_force(ka : Double, gamma : Double, h : Double) -> Doublefn rankine_active_force_position(h : Double) -> Doublefn rankine_active_pressure(ka : Double, gamma : Double, z : Double) -> Doublefn rankine_active_pressure_cohesive(ka : Double, gamma : Double, z : Double, c : Double) -> Doublefn rankine_active_pressure_surcharge(ka : Double, gamma : Double, z : Double, q : Double) -> Doublefn rankine_passive_coefficient(phi_deg : Double) -> Doublefn rankine_passive_pressure(kp : Double, gamma : Double, z : Double) -> Doublefn rankine_passive_pressure_cohesive(kp : Double, gamma : Double, z : Double, c : Double) -> Doublefn saturated_density(gs : Double, e : Double, rho_w : Double) -> Doublefn settlement_layer(av : Double, e0 : Double, sigma_z : Double, hi : Double) -> Doublefn settlement_layer_es(es : Double, sigma_z : Double, hi : Double) -> Doublefn stress_influence_coefficient_simplified(z : Double, b : Double) -> Doublefn submerged_unit_weight(gamma_sat : Double, gamma_w : Double) -> Doublefn swedish_circle_safety_factor(c : Double, phi_deg : Double, slices : Array[(Double, Double, Double)]) -> Doublefn terzaghi_bearing_capacity(c : Double, q : Double, gamma : Double, b : Double, phi_deg : Double) -> Doublefn terzaghi_bearing_capacity_shape(c : Double, q : Double, gamma : Double, b : Double, phi_deg : Double, sc : Double, sq : Double, sgamma : Double) -> Doublefn terzaghi_nc(phi_deg : Double) -> Doublefn terzaghi_ngamma(phi_deg : Double) -> Doublefn terzaghi_nq(phi_deg : Double) -> Doublefn time_factor(cv : Double, t : Double, h : Double) -> DoubleInstall
Download zip