decks: ties as Abaqus *TIE and LS-DYNA tied contact

Nastran refuses them by name.

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-14 15:28:02 -04:00
1 parent 7e9366f726
commit 794aa9f158
4 files changed
+48 -2

No files matched your search

+20
View File
@@ -28,6 +28,11 @@
//! initial overclosure have no Abaqus counterpart and are noted in comments (Abaqus chooses its
//! own penalty and resolves overclosure in the first increment).
//!
//! # Ties
//!
//! Each tie is `*TIE, NAME=…, ADJUST=NO` with the secondary surface first and its position
//! tolerance when it has one: FieldCraft ties the nodes where they are (no adjustment).
//!
//! # Steps and the activity table
//!
//! The model lists, for every step, exactly the boundary conditions and loads active in it; Abaqus
@@ -187,6 +192,7 @@ pub fn write_resolved(model: &Model, r: &Resolved) -> Result<String> {
d.discrete_properties(&discrete)?;
d.couplings(model, r);
d.contacts(model, r)?;
d.ties(model)?;
d.steps(model, r)?;
Ok(d.out)
}
@@ -1042,6 +1048,20 @@ impl Deck {
Ok(())
}
/// Ties: `*TIE` per tie, secondary surface first.
fn ties(&mut self, model: &Model) -> Result<()> {
if model.ties().is_empty() {
return Ok(());
}
self.comment("Ties: each secondary surface bonded to its main surface");
for (name, t) in model.ties() {
let tolerance = t.position_tolerance.map_or(String::new(), |v| format!(", POSITION TOLERANCE={v:?}"));
self.line(&format!("*TIE, NAME={name}, ADJUST=NO{tolerance}"));
self.line(&format!("{}, {}", t.secondary, t.main));
}
Ok(())
}
fn boundary_lines<'n>(&mut self, model: &Model, r: &Resolved, names: impl IntoIterator<Item = &'n String>) -> Result<()> {
for name in names {
let Some(bc) = model.boundary_condition(name) else { continue };