Shells and beams: MITC4/MITC3 shells, Timoshenko beams, six-DOF nodes (M4) (#47)

* fem: MITC4/MITC3 flat shells and Timoshenko beams with profile properties (ElementDofs STRUCTURAL)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* solver: shells and beams on the DofLayout beside solids, 2D elements and trusses; analytic verification and tagged benchmarks

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

* engine: probe rotations, reaction moments and shell and beam element results; docs for shells and beams

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm

---------

Co-authored-by: jyviko <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
This commit is contained in:
authored and GitHub committed 2026-10-13 22:00:25 -04:00
1 parent 6de6de13aa
commit 29ae46ff84
18 files changed
+2411 -48

No files matched your search

+24 -9
View File
@@ -150,13 +150,20 @@ module docs; ADR 0001 records why the linear algebra is our own.
the unknowns their nodes are given (`discrete::needs`, `discrete::dof_of`); dashpots are
ignored with a warning (no velocities in static and frequency steps). Every reference point a
coupling or a discrete element uses gets six degrees of freedom (translations, rotations) after
the mesh's. Shells
and beams return "not supported yet". The step's boundary conditions prescribe translations
(rotations do not exist on solid nodes) and a coupled point's six directions; its loads become
a load vector: forces and tractions from `Resolved::nodal_loads`, forces and moments on coupled
reference points, pressure as consistent face loads, gravity and body forces through the
element shape functions.
2. **Assembly** on the node graph (3 × 3 blocks for solids, 2 × 2 in 2D models, elements in label order, so sums are
the mesh's. Shell sections make quad4 (MITC4) and tri3 (MITC3) flat shells with a drilling
rotation (`modelcraft_fem::shell`; quad8 and tri6 shells are "not supported yet"), beam
sections two-node Timoshenko beams with the profile's section properties and the section's
orientation vector (`modelcraft_fem::beam`); both declare `ElementDofs::new(DofSet::STRUCTURAL)`
(`system::Structural`), so their nodes carry translations and rotations and the solids and
trusses sharing those nodes add into the translations. Shells and beams need isotropic
materials until material orientations exist, and are 3D only. The step's boundary conditions
prescribe the kinds a node carries (rotations of solid-only nodes are ignored) and a coupled
point's six directions; its loads become a load vector: forces, moments and tractions from
`Resolved::nodal_loads`, forces and moments on coupled reference points, pressure as
consistent face loads (shell faces too), gravity and body forces through the element shape
functions (consistent forces and moments on shells and beams).
2. **Assembly** on the node graph (one dense block per node pair: 3 × 3 for solids, 2 × 2 in 2D
models, up to 6 × 6 at shell and beam nodes; elements in label order, so sums are
reproducible bit for bit).
3. **Ordering and elimination** (`constraints`). Nested dissection of the nodes by coordinate
bisection. Couplings become linear constraint rows: kinematic = rigid link of each coupled
@@ -170,8 +177,10 @@ module docs; ADR 0001 records why the linear algebra is our own.
numbers are those of plain elimination, bit for bit.
4. **Static solution.** Up-looking sparse Cholesky (the factor size is computed and capped before
any value), reactions T_pᵀ (K u − f) (at nodes and at prescribed reference points, forces and
moments), integration-point stresses extrapolated to the nodes and averaged, von Mises. A zero
pivot names the node or reference point and direction that can move freely.
moments), integration-point stresses extrapolated to the nodes and averaged, von Mises. Shells
report section forces and bottom, middle and top stresses at their nodes (their top surface
joins the nodal average), beams their end section forces; nodes report rotations and reaction
moments. A zero pivot names the node or reference point and direction that can move freely.
5. **Frequency.** Shift-invert block Lanczos (block 6, full reorthogonalization) on
K − σM, σ = 0 for a supported structure and slightly negative for a free one, so rigid-body
modes come out at zero; mass-normalized shapes, participation factors and effective masses.
@@ -196,6 +205,12 @@ a kinematically coupled point (twist and shear stress). `crates/solver/tests/one
forces of determinate trusses (a plane Pratt truss, a space tripod) against the method of joints,
the three-bar truss, a rod3 constant-stress patch and a bar hanging under its weight, spring–mass,
skew springs, the two-mass chain, a bar with a tip mass and the torsional pendulum.
`crates/solver/tests/structural.rs`: membrane and bending patch tests of quad4 and tri3 shells
in a tilted plane, the simply supported plate under pressure against Navier's series (deflection
and first frequency), cantilever beams against Timoshenko (exact) and Euler–Bernoulli
frequencies, a portal frame against slope-deflection, solids continued by rods and skinned by
shells. `crates/solver/tests/benchmarks.rs` (published reference values, tagged with their
source, separate from the analytic gate): the Scordelis–Lo roof and the pinched cylinder.
## Explicit solver
+2 -2
View File
@@ -32,7 +32,7 @@ hex8/20/27 with first and second derivatives).
|---|---|---|
| Truss, 2-node (2D and 3D) | Axial members, cables (compression allowed) | done (rod2: implicit, in plane models with their two unknowns per node; explicit, corotational under nonlinear geometry; Abaqus T3D2 / T2D2, Nastran CROD, LS-DYNA truss beam (3D models)) |
| Truss, 3-node (2D and 3D) | Curved axial members | done (rod3: implicit, plane models too; explicit with small displacements; Abaqus T3D3 / T2D3; no Nastran or LS-DYNA counterpart) |
| Beam, 2-node Timoshenko, 3D | Frames, stiffeners; shear deformable | in progress (shells and beams) |
| Beam, 2-node Timoshenko, 3D | Frames, stiffeners; shear deformable | done (exact interdependent interpolation, profile properties, orientation vector; `modelcraft_fem::beam`) |
| Beam, 2-node Euler–Bernoulli (cubic), 2D and 3D | Slender frames; exact for end-loaded prismatic members | planned (1D elements II) |
| Beam, 3-node Timoshenko (quadratic), 2D and 3D | Curved and stocky beams | planned (1D elements II) |
| Beam, 2D (planar frames) | In-plane frames with 3 DOFs per node | planned (1D elements II) |
@@ -57,7 +57,7 @@ hex8/20/27 with first and second derivatives).
| Element | Use | Status |
|---|---|---|
| Shell quad4 (MITC4), triangle (locking-free) | Thin and thick shells | in progress (shells and beams) |
| Shell quad4 (MITC4), triangle (locking-free) | Thin and thick shells | done (flat MITC4 and MITC3 with a Hughes–Brezzi drilling rotation; `modelcraft_fem::shell`) |
| Shell quad8 / tri6 | Curved thick shells | planned |
| Continuum shells (8-node, on swept hex) | Thick-to-thin shells, composites through thickness | planned (M8) |
| Membranes (tri3, quad4, quad8) | Fabrics, inflatables, skins without bending | planned |
+1 -1
View File
@@ -135,7 +135,7 @@ shown greyed with the roadmap milestone that brings them (ROADMAP.md).
| Display | Contours — Contours of displacement and stress, with a legend | ready | `results.contour` |
| Display | Mode Shapes — Mode shapes and frequencies of a frequency step | ready | `results.modes` |
| Display | Animate — Animate the deformed shape, a mode or an explicit step's frames | ready | `results.animate`, `results.frame` |
| Query | Probe — Displacement, reaction and stress at nodes, a mode shape, or an explicit field frame (or click the model) | ready | `solve.probe`, `solve.history` |
| Query | Probe — Displacement, rotation, reaction and stress at nodes, element section forces, a mode shape, or an explicit field frame (or click the model) | ready | `solve.probe`, `solve.history` |
| Query | Reactions — Reaction force and moment sums per set | ready | `results.reactions` |
| Query | Free Body — Free-body forces across a cut | coming soon (M9) | |
| Plots | XY Plot — Plot a quantity against time or another | coming soon (M9) | |
+1 -1
View File
@@ -62,7 +62,7 @@ products are run, no documentation text is copied). Status: **done**, **started*
| Decks | Nastran bulk data writer (`deck.write`, SOL 101 or 103 per deck; reports what Nastran cannot express) | M3 | | done |
| Decks | LS-DYNA keyword writer (implicit; explicit in M8) | M3 | | done (implicit static and eigenvalue; beam sections planned) |
| Decks | Readers keeping unknown keywords | M9 | | planned |
| Solve | Own linear static and modal solver, verified against analytic solutions | M4 | yes | started (solid elements: tet4, tet10, wedge6, hex8, hex20; 2D plane stress, plane strain and axisymmetric tri3, tri6, quad4 (full, incompatible modes), quad8 (full, reduced); reference points, kinematic and distributing couplings, moments; centrifugal loads) |
| Solve | Own linear static and modal solver, verified against analytic solutions | M4 | yes | started (solid elements: tet4, tet10, wedge6, hex8, hex20; 2D plane stress, plane strain and axisymmetric tri3, tri6, quad4 (full, incompatible modes), quad8 (full, reduced); quad4/tri3 MITC shells and Timoshenko beams with profiles, mixed with solids; reference points, kinematic and distributing couplings, moments; centrifugal loads) |
| Solve | Own explicit dynamics solver (central differences, one-point hex8 with hourglass control, nodal-pressure tet4, bulk viscosity, energy balance), verified against analytic wave and impact solutions | M10 | yes | started (X1 core and X2: large deformation, objective rates, J2 and Johnson–Cook plasticity, damage, erosion; contact planned) |
| Results | Deformed shape, contours, mode shapes, probes, reaction sums | M4 | | started (results in the session, `solve.probe`, reaction sums; display planned) |
| Results | XY and path plots, cuts, display groups, free-body forces, animation | M9 | | planned |
+18
View File
@@ -1003,6 +1003,24 @@ the module docs):
Cook et al. 2002, §2.2 and §2.10; HRZ lumping as above. Verified against the method of joints
(statically determinate trusses), the three-bar truss, the hanging bar, √(k/m), the two-mass
chain and the torsional pendulum √(k_t/J).
- Shells: E. N. Dvorkin, K.-J. Bathe, *A continuum mechanics based four-node shell element for
general nonlinear analysis*, Engineering Computations 1(1):77–88, 1984 (MITC4 shear tying);
K.-J. Bathe, E. N. Dvorkin, IJNME 21(2):367–383, 1985 (the flat-plate form); P.-S. Lee,
K.-J. Bathe, *Development of MITC isotropic triangular shell finite elements*, Computers &
Structures 82(11–13):945–962, 2004 (MITC3); T. J. R. Hughes, F. Brezzi, *On drilling degrees of
freedom*, CMAME 72(1):105–121, 1989 (drilling penalty); facet shells, O. C. Zienkiewicz,
R. L. Taylor, D. D. Fox, *The Finite Element Method for Solid and Structural Mechanics*, 7th
ed., 2014, ch. 9–10.
- Beams: J. S. Przemieniecki, *Theory of Matrix Structural Analysis*, McGraw-Hill 1968, §5.6;
Z. Friedman, J. B. Kosmatka, Computers & Structures 47(3):473–481, 1993 (interdependent
Timoshenko interpolation); G. R. Cowper, J. Appl. Mech. 33(2):335–340, 1966 (shear
coefficients); S. P. Timoshenko, J. N. Goodier, *Theory of Elasticity*, 3rd ed., 1970, §109
(torsion of a rectangle); W. D. Pilkey, *Analysis and Design of Elastic Beams*, Wiley 2002
(thin-walled shear areas and torsion).
- Shell benchmarks (published values, tagged, not the analytic gate): Scordelis–Lo roof 0.3024
(MacNeal & Harder 1985); pinched cylinder 1.8248 · 10⁻⁵ (T. Belytschko, H. Stolarski, W. K.
Liu, N. Carpenter, J. S.-J. Ong, CMAME 51(1–3):221–258, 1985). Plate: S. Timoshenko,
S. Woinowsky-Krieger, *Theory of Plates and Shells*, 2nd ed., 1959, §30 (Navier).
- Verification: R. H. MacNeal, R. L. Harder, *A proposed standard set of problems to test finite
element accuracy*, Finite Elem. Anal. Des. 1(1):3–20, 1985 (patch tests); Lamé, Kirsch,
Timoshenko and Euler–Bernoulli closed forms; Saint-Venant's principle (tension through a