visualdynamics.demo.frame¶
frame
¶
The four-unit frame and its wings, built from blocks of bricks.
The four-unit frame is a small aluminum ladder the structural dynamics community shares as a common test article for substructuring: a 16 by 6 in frame cut from half-inch plate, two rails and five uprights half an inch wide, with 41 threaded steel inserts for bolting things to, and two rectangular 22 by 4.4 in wings, thin (1/8 in) and thick (1/4 in), that screw across two of its uprights. Its solid models, finite element models and test data are shared on the SEM Dynamic Substructuring Focus Group wiki, https://wiki.sem.org/wiki/Round_Robin_Frame_Structure.
Here it is built the way a person would build a solid model with this
package (2026-09-30): each part as the rectangular blocks it is made
of, meshed into bricks (visualdynamics.mesh.block), the insert holes
cut from the blocks and their bricks given the insert's material, the
wing's holes cut through, and the screws as rigid links over the
bricks each washer covers, the way the BARC's bolts are. Every
dimension below is read off the shared finite element models, in
inches:
from visualdynamics.demo import frame
model = frame.build() # the frame alone
shapes = model.eigensolution(maximum_frequency=2000)
both = frame.build('thick wing') # the frame with a wing on it
The solid elements are the model. Beams describe a half-inch bar spanning a hundred-millimeter window poorly and plates not at all, so this example is what the eight-node brick with incompatible modes was written for. The element was checked against the mesh the wiki shares: solved here node for node, its first ten elastic modes land within 0.1 % of the frequencies MSC Nastran gives the same mesh. The model built here is coarser — one brick in twelve of an inch, five thousand nodes for the frame where the shared mesh has ninety thousand — and its holes are stair-stepped, and it lands within a few percent of the frames that were measured, which vary by as much among themselves.
What the frames were measured to is on the wiki; the wings' and the
assembly's frequencies here were fitted from the shared test FRFs with
Project.fit_modes. None of the wiki's files ship with this package.
Run it directly to print the models and their first modes:
python3 -m visualdynamics.demo.frame
Functions:
| Name | Description |
|---|---|
geometry |
The frame, a wing, or the frame with a wing screwed on, as a |
washer_patch |
The wing's bricks a screw's washer covers: those of the wing's |
build |
The finite element model ( |
project |
A project to open in the app: the frame, each wing alone, and |
describe |
Print each model and its first elastic modes. |
Classes¶
Functions:¶
geometry
¶
The frame, a wing, or the frame with a wing screwed on, as a
geometry of bricks and rigid links, every element group given what it is
made of — ready for fem.Model.from_geometry, or for the app's
Solve Modes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
wing
|
(None, 'thin wing', 'thick wing', 'frame')
|
None or 'frame' for the frame alone; a wing's name for the frame with that wing; 'thin wing alone' or 'thick wing alone' for the wing by itself. |
None
|
size
|
float
|
The frame's element size aimed at, in inches. |
SIZE
|
wing_size
|
float
|
The wing's, in inches. |
WING_SIZE
|
Returns:
| Type | Description |
|---|---|
Geometry
|
Element groups 'frame' (6061-T6), 'inserts' (the insert material), the
wing (6061-T6) and 'screws' (rigid links over the bricks each
washer covers), opening on |
Source code in src/visualdynamics/demo/frame.py
washer_patch
¶
The wing's bricks a screw's washer covers: those of the wing's
element group whose centers lie within WASHER_RADIUS of the screw's axis,
the full thickness of the wing — a rigid plug where the screw and
its washers clamp the plate, tied to the frame under it.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
geometry
|
Geometry
|
The frame and wing, assembled. |
required |
wing
|
str
|
The wing's element group name. |
required |
screw
|
tuple
|
(x, y) of the screw, inches. |
required |
Returns:
| Type | Description |
|---|---|
list of int
|
The element ids. |
Source code in src/visualdynamics/demo/frame.py
build
¶
The finite element model (geometry built), the screws' mass
lumped at the frame under each.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
wing
|
str | None
|
As for |
None
|
size
|
str | None
|
As for |
None
|
wing_size
|
str | None
|
As for |
None
|
Returns:
| Type | Description |
|---|---|
Model
|
|
Source code in src/visualdynamics/demo/frame.py
project
¶
A project to open in the app: the frame, each wing alone, and the frame with each wing, their element groups given their properties — Solve Modes on any of them gives its modes.
frame.project().save('frame.vdyn')
With solved, every model's modes are solved to SOLVE_TO
already: the example project the downloads page offers.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
solved
|
bool
|
Solve the modes as well. |
False
|
size
|
float
|
The element sizes aimed at, in inches. |
SIZE
|
wing_size
|
float
|
The element sizes aimed at, in inches. |
SIZE
|
Returns:
| Type | Description |
|---|---|
Project
|
|
Source code in src/visualdynamics/demo/frame.py
describe
¶
Print each model and its first elastic modes.