Elastic Link (twoNodeLink) Beta Angle coordinate transformation — inclined 6-DOF spring
Elastic Link (twoNodeLink) Beta-Angle -orient transform — inclined 6-DOF spring vs independent closed form
Technical features tested
- twoNodeLink (Elastic Link) — 6 generalized DOF springs, non-coincident nodes
- Beta-Angle → -orient conversion ("MIDAS convention", TclBuilder.writeElasticLinks) — DCR-authored, never independently checked before
- Both up-vector branches exercised (near-vertical vs general member)
- Anisotropic 6-DOF stiffness + general 6-component load (no symmetry to hide an axis error)
- Tcl engine only — Elastic Link is absent from StaticPyBuilder
Problem description
STRIX exposes a "Beta Angle" field for Elastic Links (the MIDAS-style member-orientation convention), converted at runtime into the -orient vector pair OpenSees's twoNodeLink element expects. This conversion is DCR's own code — never independently verified — unlike the element formulation itself (stock OpenSees, trusted the same way ASDShellQ4's own formulation is trusted). No CSI/NAFEMS published example fits this scope (CSI's Group 6 Link catalog is entirely dynamic/nonlinear — ramp loading, gap, hook, damper, isolator — with no purely static linear-spring test), so this benchmark is a self-designed closed form: a fully fixed ground node connected to one free node by a single, inclined Elastic Link with six distinct (anisotropic) DOF stiffnesses, loaded by a fully general 6-component point load. Because every stiffness direction is distinct, any sign flip, axis swap, or wrong up-vector branch in the Beta-Angle conversion changes every displacement component — a symmetric/isotropic transverse stiffness would hide such an error entirely, since rotating an isotropic spring about its own axis changes nothing. Two geometry variants exercise both branches of the up-vector selection ("near-vertical member → up = Global X" vs "otherwise → up = Global Z"). De-risk finding: an initial closed-form draft assumed the six directions were fully independent springs; a controlled single-component-load experiment against the real engine revealed a pure moment load producing a nonzero translation response. Fetching OpenSees's own TwoNodeLink.cpp source confirmed this is real, documented element kinematics for a non-coincident link (shear-direction deformation includes a lever-arm term from both nodes' rotations, located at the -shearDist fraction of the element length) — not DCR's own code, so it was folded into the closed form rather than treated as a defect, and the corrected closed form matches the real engine to machine precision.
Geometry, properties & loading
Geometry (2 variants)
- Ground node N1
- (0, 0, 0) mm, fixed
- Oblique N2
- 25 ° (β)
- Near-vert. N2
- -40 ° (β)
- Up-vector branches
- Global Z & Global X (both hit)
Link stiffness (anisotropic)
- SDx / SDy / SDz
- 480000 kN/m (+ 2 more, distinct)
- SRx
- 8200 kN·m/rad
- SRy
- 13500 kN·m/rad
- SRz
- 19800 kN·m/rad
Loading & method
- Load at N2
- 6-component (Fx,Fy,Fz,Mx,My,Mz)
- Engine
- Tcl (OpenSees.exe)
- Reference method
- Independent 6×6 congruence + Gauss solve
- Self-weight
- off
Reference solution
- Oblique Ux
u = ((C*T)^T diag(k_local) (C*T))^-1 F, T from MIDAS Beta-Angle frame (betaDeg=25), C = TwoNodeLink shear-rotation coupling (shearDist=0.5)= 0.152961 mm - NearVert Ux
u = ((C*T)^T diag(k_local) (C*T))^-1 F, T from MIDAS Beta-Angle frame (betaDeg=-40), C = TwoNodeLink shear-rotation coupling (shearDist=0.5)= −0.12171 mm
Self-designed closed form (no CSI/NAFEMS published example fits — CSI Group 6 Link catalog is dynamic-only, see devplan §12.3 SB12 note). Independent reference = exact linear-algebra congruence transform K_global = (C*T)^T * diag(k_local) * (C*T), solved by an independent Gaussian-elimination linear solve. T = blockdiag(R,R), R = MIDAS Beta-Angle local frame re-derived from scratch (benchmarks/element/SB12_elasticLink.ts, no import from production TclBuilder code) -- this is the transform under test. C = OpenSees TwoNodeLink's own shear/rotation basic-deformation coupling (TwoNodeLink.cpp setTranLocalBasic(), confirmed against OpenSees/OpenSees GitHub source; shearDist fixed 0.5 as DCR always emits) -- real, documented, non-DCR element physics, included only so the closed form matches the engine, not itself under test. Not a FEM discretization/convergence problem -- exact linear algebra, so near-machine-precision agreement with the simulated result is expected.
Results comparison
| Response quantity | Probe | STRIX | Reference | Δ | Verdict |
|---|---|---|---|---|---|
| Oblique Ux (mm) | N2.ux | 0.152961 | 0.152961 | +0.000081% | PASS |
| Oblique Uy (mm) | N2.uy | −0.322861 | −0.322861 | +0.000095% | PASS |
| Oblique Uz (mm) | N2.uz | 0.434406 | 0.434406 | −0.000068% | PASS |
| Oblique Rx (rad) | N2.rx | 3.5379×10⁻⁴ | 3.5379×10⁻⁴ | +0.000084% | PASS |
| Oblique Ry (rad) | N2.ry | −2.3792×10⁻⁴ | −2.3792×10⁻⁴ | −0.000020% | PASS |
| Oblique Rz (rad) | N2.rz | −4.2642×10⁻⁵ | −4.2642×10⁻⁵ | +0.000064% | PASS |
| NearVert Ux (mm) | N2.ux | −0.12171 | −0.12171 | +0.00027% | PASS |
| NearVert Uy (mm) | N2.uy | 0.426039 | 0.426039 | +0.000090% | PASS |
| NearVert Uz (mm) | N2.uz | −0.015319 | −0.01532 | +0.000063% | PASS |
| NearVert Rx (rad) | N2.rx | −2.9586×10⁻⁴ | −2.9586×10⁻⁴ | +0.00014% | PASS |
| NearVert Ry (rad) | N2.ry | −2.0239×10⁻⁵ | −2.0239×10⁻⁵ | −0.000049% | PASS |
| NearVert Rz (rad) | N2.rz | −1.4598×10⁻⁴ | −1.4598×10⁻⁴ | −0.000065% | PASS |
Up-vector branch coverage (free node Ux)
| Variant | Ux (mm) | Δ |
|---|---|---|
| oblique (betaDeg=25) | 0.152961 | +0.000081% |
| nearVertical (betaDeg=-40) | −0.12171 | +0.00027% |
Not a mesh-convergence study — this is exact linear algebra (a 6×6 congruence transform + direct solve), not a discretized FEM problem, so no mesh exists to refine. The two rows instead demonstrate branch coverage: the oblique variant exercises the "otherwise → up = Global Z" branch of the Beta-Angle convention, while the near-vertical variant exercises the opposite "near-vertical member → up = Global X" branch — the two mutually-exclusive code paths inside TclBuilder.writeElasticLinks. Both reproduce the independent closed form to under 0.0003% across all twelve probed quantities (6 DOF × 2 variants), consistent with the expected near-machine-precision agreement of an exact linear system.
Conclusion
STRIX reproduces the reference solution to +0.000081% (tolerance 0.01%). The tested element and its formulation are verified against the reference.
References & analysis files
- OpenSees — TwoNodeLink element (Wiki): https://opensees.berkeley.edu/wiki/index.php/Two_Node_Link_Element
- OpenSees — TwoNodeLink.cpp source (setTranLocalBasic()), OpenSees/OpenSees GitHub — basic-deformation shear/rotation coupling formula.
- MIDAS — Elastic Link (Beta Angle member-orientation convention): https://support.midasuser.com/hc/en-us/articles/17917025888281-Elastic-Link
- CSI — SAP2000 Analysis Verification, Group 6 (Link) catalog — surveyed and found to contain no static linear-spring example (all dynamic/nonlinear), motivating this self-designed closed form.
- Engine
- v1.0.6 (tcl)
- Run date
- 2026-07-11
- Record
- records/SB12.json
- Evidence archive
- verif-evidence-eng1.0.2-win-x64.zip · SB12/
- sha256
- (pending publish)