solver, decks: symmetry about an inclined plane (#242)

The symmetry condition takes any plane normal ({"normal": [nx, ny, nz]}).
An inclined one holds n·u = 0 and, at shell, beam and reference point
nodes, the rotations about the two in-plane axes: constraint rows the
implicit elimination already handles, its support forces reported as
reactions. Decks: Abaqus *EQUATION, Nastran MPC sets per subcase, LS-DYNA
*BOUNDARY_SPC in a *DEFINE_COORDINATE_SYSTEM along the normal.

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-16 10:38:20 -04:00
1 parent a079e51f9d
commit ac1037e1af
11 files changed
+1009 -53

No files matched your search

+13
View File
@@ -176,6 +176,19 @@ impl Model {
.collect()
}
/// The mesh nodes with rotational degrees of freedom under the model's own sections: those of
/// shells and beams, not of plane stress, plane strain or axisymmetric elements.
pub fn rotating_nodes(&self) -> BTreeSet<u32> {
let planar: BTreeSet<u32> = self
.sections
.values()
.filter(|s| s.kind.extent().is_some())
.filter_map(|s| self.resolve_set_partial(&s.set))
.flat_map(|r| r.elements)
.collect();
self.rotational_nodes(|l| planar.contains(&l))
}
fn analyze(&self) -> (Resolved, Vec<Diagnostic>) {
let mut d = Diagnostics::default();
let mut resolved = Resolved::default();