SB12 · STATIC-LINK · Element Benchmarks

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

PASS +0.000081% error tolerance 0.01% 0.152961 mm vs 0.152961 mm
§2

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
§3

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.

N1 (ground, fixed 6-DOF) twoNodeLink (Elastic Link) N2 (free, 6-DOF load) F M y0 (default) yp (β) β view along local x (member axis) Z X
Figure SB12. Ground node N1 (fixed, all 6 DOF) connected to free node N2 by one inclined twoNodeLink; N2 carries a general 6-component load. Inset: end-view along the member axis showing the default local-y axis (y0) rotated by Beta Angle β to yp — the transform under test.
§4

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
§5

Reference solution

  1. Oblique Uxu = ((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
  2. NearVert Uxu = ((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.

§6

Results comparison

Response quantityProbeSTRIXReferenceΔ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
§7

Up-vector branch coverage (free node Ux)

VariantUx (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.

§8

Conclusion

PASS

STRIX reproduces the reference solution to +0.000081% (tolerance 0.01%). The tested element and its formulation are verified against the reference.

§9

References & analysis files

  1. OpenSees — TwoNodeLink element (Wiki): https://opensees.berkeley.edu/wiki/index.php/Two_Node_Link_Element
  2. OpenSees — TwoNodeLink.cpp source (setTranLocalBasic()), OpenSees/OpenSees GitHub — basic-deformation shear/rotation coupling formula.
  3. MIDAS — Elastic Link (Beta Angle member-orientation convention): https://support.midasuser.com/hc/en-us/articles/17917025888281-Elastic-Link
  4. 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)