verification: series-resistance heat flow across a tie (#358)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-15 08:27:01 -04:00
1 parent 836513ddfe
commit febcffefd6
5 files changed
+195 -7

No files matched your search

+22 -6
View File
@@ -109,7 +109,9 @@ A heat conduction element carries one temperature per node (`heat::HEAT_DOFS`, k
and a source ∫ N Q dV (mass rule), and the heat flux −k∇T at the integration points;
`heat::face_weights` and `face_film` integrate surface flux and convection on tri3/tri6/quad4/quad8
faces. The solver (`fieldcraft_solver::heat`) numbers the temperatures with
`DofLayout::uniform(…, DofSet::TEMPERATURE)` and assembles with the same `sparse::add_block`.
`DofLayout::uniform(…, DofSet::TEMPERATURE)`, assembles with the same `sparse::add_block`, and
eliminates prescribed temperatures and ties (see Ties) with the structural solver's
`constraints::Reduction`.
Thermal strain ε_th = α (T − T_ref) along the material axes enters a solid as the load
`Solid::thermal_load(d, &ThermalStrain { alpha, delta })` = ∫ Bᵀ D ε_th dV and its stress as
@@ -586,12 +588,26 @@ frequency, buckling and nonlinear steps (small-displacement constraints). Dividi
keeps rigid motions exact at a surface's edge where a face is only partly covered. Main faces
count when the secondary face overlaps them along its normal with a mean gap within the position
tolerance (default half the main element's thickness); uncovered secondary nodes stay free with a
warning. Heat transfer and explicit dynamics refuse ties by name.
warning. Explicit dynamics refuses ties by name.
**Verification** (`crates/solver/tests/contact.rs`, `tests/oracle/tie-patch`): a linear field
across non-matching hex8/tet4 meshes reproduced to round-off (to 10⁻⁶ on distorted quadrilateral
faces, where the overlap integration is accurate to its degree) in linear and nonlinear static
steps; uniaxial tension across a tie, σ_zz = Eε in every element to 10⁻⁹.
**Heat** (`fieldcraft_solver::heat`): the same weights tie temperatures, T_A = Σ_J w_AJ T_J (one row
per secondary node, `tie::rows_of` with the temperature kind), in steady and transient heat
transfer and in the heat solution of coupled temperature–displacement steps. The heat solver
eliminates them with the prescribed temperatures through the same transformation
(`constraints::Reduction`), so the interface has no resistance, the heat leaving one side enters
the other, and the reactions at prescribed temperatures (T_pᵀ (K T + C Ṫ − f)) balance the heat
supplied.
**Verification** (`crates/solver/tests/contact.rs`, `tests/oracle/tie-patch`,
`tests/oracle/tie-heat-series`): a linear field across non-matching hex8/tet4 meshes reproduced to
round-off (to 10⁻⁶ on distorted quadrilateral faces, where the overlap integration is accurate to
its degree) in linear and nonlinear static steps; uniaxial tension across a tie, σ_zz = Eε in
every element to 10⁻⁹. Heat: steady conduction between held ends through tied hex8/tet4 blocks
(matching, graded and mixed meshes), the linear profile, the flux and the heat flow k A ΔT / L to
10⁻⁹; with conductivities k₁ ≠ k₂ the series-resistance interface temperature
(k₁ T₀ + k₂ T₁)/(k₁ + k₂) and heat flow ΔT/(L₁/k₁ + L₂/k₂); a transient tied bar equal to the
single-body bar; a coupled step with a tie at a uniform ΔT expands freely (u = α ΔT x, no stress).
Ties take linear faces only (tet4, wedge6, hex8), for heat as for displacement.
## Hyperelastic materials in explicit dynamics