Solid mechanics in Rust. Stress, strain, and structural analysis.
- Stress and strain tensors — Cauchy stress and infinitesimal strain as symmetric 3×3 matrices, with hydrostatic/deviatoric decomposition, principal values, invariants, traction vectors
- Constitutive relations — isotropic Hooke's law, Lamé parameters, 6×6 Voigt stiffness/compliance, orthotropic elasticity
- Mohr's circle — 2D and 3D construction, stress transformation, principal stresses
- Beam mechanics — Euler-Bernoulli beam: deflection, bending moment, shear force for simply-supported and cantilever beams
- Finite elements — 1D bar elements, global stiffness assembly, displacement solution, stress recovery
- Yield criteria — von Mises and Tresca
- Plane stress and plane strain — 2D stress-strain conversion, out-of-plane response, 3×3 stiffness matrices
- Energy methods — strain energy density, Castigliano's theorem, complementary energy
[dependencies]
solid-mechanics = "0.1.0"Requires Rust 2021 edition. Depends on nalgebra and serde.
use solid_mechanics::tensor::StressTensor;
let sigma = StressTensor::from_components(80.0, -40.0, 20.0, 30.0, 0.0, 0.0);
println!("Hydrostatic stress: {}", sigma.hydrostatic());
println!("Von Mises: {}", sigma.von_mises());
println!("Principal stresses: {:?}", sigma.principal_stresses());use solid_mechanics::{StressTensor, StrainTensor, HookeIsotropic};
let steel = HookeIsotropic::new(200e9, 0.3);
let stress = StressTensor::uniaxial(100e6);
let strain = steel.strain_from_stress(&stress);use solid_mechanics::MohrCircle;
let mc = MohrCircle::from_2d(80.0, -40.0, 30.0);
println!("σ₁ = {}, σ₂ = {}", mc.sigma1, mc.sigma2);use solid_mechanics::EulerBernoulliBeam;
let beam = EulerBernoulliBeam::new(200e9, 1e-4, 5.0);
println!("Max deflection: {}", beam.max_deflection_centered_point(10000.0));use solid_mechanics::fem::{BarElement1D, FemAssembler1D};
let fem = FemAssembler1D::uniform_bar(200e9, 1e-4, 5.0, 10);
let mut forces = vec![0.0; 11];
forces[10] = 50000.0;
let u = fem.solve(&forces, &[0]).unwrap();use solid_mechanics::{VonMises, Tresca, StressTensor};
let vm = VonMises::new(250e6);
let stress = StressTensor::from_components(200e6, 100e6, -50e6, 60e6, 0.0, 0.0);
println!("Von Mises equivalent: {}", VonMises::equivalent_stress(&stress));
println!("Safety factor: {}", vm.safety_factor(&stress));MIT OR Apache-2.0