WIP (parked): folding robustness, stabilization, mesh.revolve, boot-seal profile

Parked work for #182/#185 (not for merge as is):
- contact: held active set with primal-dual updates replaces the
  inconsistent ENGAGED_BAND tangent after chattering (moves the
  nl-friction-sliding-blocks fixture by 4.5e-8; not re-blessed)
- nonlinear: opt-in viscous stabilization (step 'stabilization',
  calibrated on the first increment), Abaqus STABILIZE, LS-DYNA refusal
- ordering: graph (level-structure) nested dissection, chosen when it
  fills less: half the fill on the revolved boot, factor time 62 s -> 25 s
- engine: mesh.revolve command (2D profile -> hex8/wedge6, tags kept)
- engine: sample/boot.rs boot-seal profile, axisymmetric and 3D scripts
Scratch still in the code: FC_TRACE/TIMES timing prints, NO_BAND/STAB/
SQUEEZE env hooks in tests, boot_axisymmetric_scratch test.

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 committed 2026-10-14 17:54:43 -04:00
1 parent 227c4544ed
commit 98eaede2dd
18 files changed
+1111 -57

No files matched your search

+10 -1
View File
@@ -1240,7 +1240,16 @@ impl Deck {
self.out.push('\n');
}
} else {
self.line("*STATIC");
match n.stabilization {
// Abaqus's automatic stabilization takes the dissipated energy
// fraction, which FieldCraft's damping fraction is.
Some(a) => {
self.out.push_str("*STATIC, STABILIZE=");
push_number(&mut self.out, a)?;
self.out.push('\n');
}
None => self.line("*STATIC"),
}
self.numbers_line("", &[n.initial_increment, 1.0, n.min_increment, n.max_increment])?;
}
if n.line_search {
+3
View File
@@ -290,6 +290,9 @@ fn plan<'a>(model: &'a Model, r: &Resolved) -> Result<Plan<'a>> {
refused.insert(format!("step `{}`: explicit dynamic steps (this writer writes implicit analyses so far)", step.name));
}
if let Procedure::NonlinearStatic(n) = &step.procedure {
if n.stabilization.is_some() {
refused.insert(format!("step `{}`: stabilization (artificial damping of a static step; not written yet)", step.name));
}
if !n.nonlinear_geometry {
refused.insert(format!(
"step `{}`: a nonlinear step without nonlinear geometry (LS-DYNA's nonlinear implicit analysis always follows the deformed shape)",