Eccentrically loaded gusseted equipment bracket
The primary engineering regression example with two rounded ribs, eight mounting holes, an eccentric bearing pad, multiaxial force, pressure, and self-weight. The simulation brief defines dimensions, assumptions, and acceptance criteria.
The 2026-09-06 test report
(简体中文)
records five passed integration tests across five real study solves in 208.16 seconds. The fine mesh has 27,980 nodes and 15,508 elements;
maximum displacement is 0.019348617 mm and reported global stress maximum is 9.040418 MPa.
Force/moment balance, mesh-change criteria, and full-field gravity-corrected linearity passed.
The engineering aggregate remains WARN for the stated stress-review limitations. The
static demonstration displays all five cases, both mesh-refinement steps, and
three unchanged result views from mixed_5mm, with optional geometry and underside views.
The 252 passed / 20 skipped offline baseline belongs to the preceding validation round. Replacing the public example does not create a new test or solve record. Public evidence remains available at the stable summary, cases, and provenance paths.
| Input | Value |
|---|---|
| Overall dimensions | 240 by 160 by 188 mm |
| Back / shelf / rib thickness | 16 / 20 / 12 mm |
| Hole diameter / count | 14 mm / 8 |
| Inside bend / rib profile radius | 10 / 6 mm |
| Material | Installed Structural Steel: E = 200 GPa, nu = 0.3, density = 7850 kg/m^3 |
| Backing | Full rear-face clamp, ideal rigid connection |
| Front-face force | [1000, 1500, -500] N at [240, 0, 170] mm |
| Pad pressure | 0.8 MPa; 3360 N downward at [165, 35, 188] mm |
| Self-weight | Earth gravity, -Z; mass and centroid from CAD |
| Reference mass | 12.028402 kg at 7850 kg/m^3 |
| Nominal specification mesh | 8 mm, explicit quadratic order |
| Study meshes / primary display | 12 / 8 / 5 mm; mixed-load 5 mm images |
This is one continuous solid. The ideal backing excludes bolt preload, slip, contact, and mounting compliance. Ribs and plates transfer load continuously; individual weld stresses are not modeled.
Inputs and dry-run
The committed STEP and its generated CAD properties are ready to use.
CAD dependencies are required only to regenerate them. On the tested Windows host, use
build123d==0.9.1 for regeneration (0.11.1 encountered a local system-font import error):
./.venv/Scripts/python.exe -m pip install "build123d==0.9.1"
./.venv/Scripts/python.exe examples/gusseted-bracket/generate_geometry.py
From the repository root:
./.venv/Scripts/python.exe -m ansys_skill.cli validate examples/gusseted-bracket/simulation.yaml --json
./.venv/Scripts/python.exe -m ansys_skill.cli run examples/gusseted-bracket/simulation.yaml --out build/bracket-dry-01 --json
The specification explicitly selects local Windows mechanical_batch. The command above remains
DRY_RUN. After reviewing inputs and explicitly choosing to solve on an installed, licensed host:
./.venv/Scripts/python.exe -m ansys_skill.cli run examples/gusseted-bracket/simulation.yaml --out build/bracket-real-01 --execute --json
Five-solve engineering study
Install the project's dev and ansys extras as described in
Windows testing. The development extra includes Pillow for
complete PNG structure verification and pixel decoding.
The integration study performs three combined-load solves on 12, 8, and 5 mm quadratic meshes, then gravity-only and doubled force/pressure solves on the 5 mm mesh. Gravity stays constant.
| Recorded case | Nodes | Elements | Max displacement mm | Max equivalent stress MPa |
|---|---|---|---|---|
mixed_12mm |
7,452 | 3,890 | 0.019119825 | 8.987440 |
mixed_8mm |
11,680 | 6,241 | 0.019221773 | 9.008833 |
mixed_5mm |
27,980 | 15,508 | 0.019348617 | 9.040418 |
gravity_5mm |
27,980 | 15,508 | 0.000159944 | 0.084056 |
double_mechanical_5mm |
27,980 | 15,508 | 0.038545872 | 18.016176 |
It checks CAD-based force and moment balance, displacement convergence, pad stress statistics,
whole-field linear superposition, native images, solver element/material settings, and input hashes.
Force and moment relative tolerances are 0.5% and 1%. Both consecutive mesh refinements must
meet 5% displacement and 10% pad stress-statistic thresholds. Pad mean and percentile statistics
weight nodes equally, not by area. The 8 → 5 mm maximum-displacement change is 0.6556%.
Full-field relative L2 error is 1.8077 × 10^-11, with no failing nodes at the stated per-node
1e-12 m + 1e-6 × ||predicted displacement|| tolerance.
Run serially with explicit opt-in and a fresh --basetemp directory:
$previousAvailable = $env:ANSYS_AVAILABLE
$previousBackend = $env:ANSYS_TEST_BACKEND
try {
$env:ANSYS_AVAILABLE = "1"
$env:ANSYS_TEST_BACKEND = "mechanical_batch"
./.venv/Scripts/python.exe -m pytest -q tests/integration/test_engineering_bracket.py --basetemp build/bracket-study-01 --junitxml=build/bracket-study-01.xml
}
finally {
$env:ANSYS_AVAILABLE = $previousAvailable
$env:ANSYS_TEST_BACKEND = $previousBackend
}
Pytest owns its temporary directory; choose a new path for each study. Each run retains
engineering-checks.json, ordinary CLI reports, RST, saved Mechanical project, and solver logs.
The study directory contains study-summary.json. An ordinary offline pytest -q skips real
integration tests and starts no solver.
The general CLI still reports pressure/gravity reaction_balance: NOT_RUN; this fixture's separate
checks supply the independently calculated resultants. safety_factor and automatic
visual_review remain NOT_RUN; the recorded manual image review is separate. Global peak stress retains a review warning
and is not a strength acceptance criterion. Compare the entire displacement field as
u(2P+G) = 2u(P+G) - u(G); do not simply double displacement maxima that include self-weight.
export_views.py is an optional fixed Mechanical script for reopening a solved project and exporting
Z-up and underside views. It requires ANSYS_AVAILABLE=1, BRACKET_VIEW_PROJECT (absolute saved
project path), and BRACKET_VIEW_OUTPUT (new directory). It neither solves nor saves the project.