# Zomestruct — Structural Sanity-Check of a PU-Foam Polar Zonohedron Dome **Author:** Claude (running as Claude Code on macOS) with Shereef **Project root:** `/Users/teacher/Dropbox/My Mac (Shereefs-MacBook-Pro.local)/Documents/code/zomestruct` **Date of this snapshot:** 2026-05-04 **Status:** active analysis; this document is the canonical snapshot of work to date so future agents (and the author) can pick up cleanly. --- ## 0. Quick navigation - [Bottom-line numbers](#11-bottom-line-engineering-result) - [What's still open / risks](#12-whats-still-open) - [Code map](#3-code-map) - [Prior reports](#5-existing-reports-to-read-first) — read these before changing anything - [Reproduction commands](#6-reproduction) --- ## 1. Executive summary ### 1.1 Bottom-line engineering result The structure under review is a small polar-zonohedron dome (the "Zomes" office) made entirely of **solid 3-inch (76.2 mm) rigid polyurethane foam panels** (240 kg/m³, ASTM-tested), 70 structural rhombic panels around a 5.6 m diameter footprint, 3.8 m tall, sitting on 9 perimeter foundation curb-strip panels. Joints between panels are adhesive + mechanical fasteners. An exterior fibre-cement skin is screwed on (non-bonded) and is treated as non-structural per the user's instruction. **Sanity-check verdict, per the validated analyses:** | Site preset | Plate-bending D/C (Timoshenko) | Joint shear/tension D/C | Compression D/C | Buckling D/C | Foundation bearing D/C | Verdict | |---|---|---|---|---|---|---| | **Severe US envelope** (160 mph wind, 100 psf snow) | **1.58 (FAIL)** | 0.35 / 0.53 (PASS) | 0.15 (PASS) | 0.35 (PASS) | 0.04 (PASS) | **FAIL plate bending** under wind suction | | **Baseline CONUS** (115 mph, 30 psf snow) | **0.66 (PASS)** | 0.15 / 0.22 (PASS) | 0.05 (PASS) | 0.13 (PASS) | 0.01 (PASS) | **PASS all** | Driver: the **largest panels (1012 × 1012 mm near-square rhombi at the equator)** govern under **C&C peak wind suction**. Every other limit state passes by 3–25× margin. The CalculiX nonlinear runs (with Drucker–Prager plasticity ramped to load-factor 50× design snow) suggest material-collapse safety factors of **36–78×** at first yield — i.e., the limit-state failure is not material yielding, it is plate flexure of the largest panels under hurricane-coastal C&C wind suction. ### 1.2 What's still open | Risk | Status | Notes | |---|---|---| | Plate-bending of largest panels under C&C peak suction at severe sites | **Identified** — fails by 1.58× | Geographic restriction (V≤130 mph) or panel thickening (76→100 mm) makes it pass | | **Creep** — PU foam at sustained load | **Not modelled**; lab data is 5 mm/min short-term | Decade-scale dead+snow could degrade capacity materially. Commission ASTM D2990 creep test or accept as design risk. | | **Cyclic wind fatigue** | **Not modelled**; no S-N data | | | **Temperature / UV / moisture aging** | **Not modelled**; lab was 23 °C / 50 % RH | PU stiffness drops at elevated T; UV degrades joints | | **Cement-skin composite action** | **Excluded by user request** | Could materially raise plate stiffness if engaged structurally; would need test data on the assembly | | **Door / window cutout stress concentrations** | **Not modelled** | Panels with cutouts have ~2–3× peak stress vs. an uncut rhombus; analyses use the un-cut rhombus envelope | | **Foundation curb panels in soil contact** | **Out of scope of structural FEA** | PU foam at grade has separate moisture / freeze-thaw / radon-pathway concerns | | **Joint stiffness in FEA** | **Treated as perfect bond** | Lab measured G_joint = 24.1 MPa (~76% of parent G); a real cohesive-zone model is the next refinement | | **Per-panel volume FEA does not converge** | **Documented limitation** | Linear tets shear-lock; averaged-normal corner geometry self-intersects in 3D; the in-house volume-mesh assembly does not give trustworthy stress magnitudes. Resolution path = shell elements (in progress, see [§ 8](#8-in-progress-shell-fea)) | --- ## 2. Inputs and lab data ### 2.1 Inputs supplied by the user - **3D geometry:** Rhino-exported `structural-full-office.obj` (1.5 GB, 6.03 M vertices, 6.35 M faces, 82 `usemtl` blocks, in inches). Lives at `assets/Office Files/structural-full-office.obj`. Earlier exports `2026-4-30--v8-OFC-FullAssembly-NoCam-NoBrace.obj` (2.0 GB) and per-panel STEP/DXF cut-sheets in `assets/Office Files/Office Pieces/`. - **Lab report** (`assets/QSW26030006 (Zomes PU).pdf`): Nanjing Guocai Testing Co., Ltd, mean values across 5–6 specimens per test, ASTM-traceable methods. - **Panel thickness:** 3 inches (76.2 mm), confirmed by user. - **Joint construction:** adhesive + mechanical fasteners. - **Construction context:** habitable buildings sited "all over the US" → the analysis brackets baseline + severe US envelopes. - **Cement skin:** screwed on, non-bonded → ignored structurally. ### 2.2 Material properties (Zomes PU foam, ρ = 240 kg/m³) All values are means over 5–6 lab specimens. See `src/zomestruct/material/pu_foam.py` for the canonical encoding. | Property | X | Y | Z | Test method | |---|---|---|---|---| | Compressive strength (MPa) | 2.58 | 2.47 | 2.62 | ASTM D1621-16 (2023) | | Compressive modulus (MPa) | 70.8 | 72.2 | 79.1 | ASTM D1621 | | Shear strength, parent (MPa) | 0.584 | 0.649 | — | ASTM C273/C273M-20 | | Shear modulus, parent (MPa) | 31.4 | 32.0 | — | ASTM C273 | | **Joint shear strength (MPa)** | **0.410** | — | — | ASTM C273 (joint specimens) | | **Joint shear modulus (MPa)** | **24.1** | — | — | ASTM C273 | | **Joint tensile strength (MPa)** | **0.270** | — | — | ASTM D1623-17 (2023) | | Flexural strength (MPa) | 2.17 | 2.28 | — | ASTM D790-17, ~10 mm coupons | | Flexural modulus (MPa) | 62.8 | 68.9 | — | ASTM D790 | | Density (kg/m³) | 240 | | | ASTM D1622-20 | Joints are weaker than parent material by ~30 % in shear and ~50 % in tension — joint-controlled limit states are flagged separately in the report module. ### 2.3 Geometric inputs derived from the OBJ From streaming the structural OBJ (`tools/extract_panels_from_obj.py`): - **82 part-blocks** → 70 rhombic panels (rhombus aspect 1–7) + 9 horizontal foundation curb strips + 3 small door framing pieces. Foundation strips are at y < 5″ and are excluded from structural analysis (treated as rigid base BC). - **Footprint** (averaged across the two horizontal axes): 5.755 × 5.505 m → 5.63 m mean diameter; **floor area ≈ 25 m²**. - **Apex height:** 3.82 m (150.25″). - **9 unique rhombus shapes** identified across the 70 structural panels (ranked by area): | # | count | edge (mm) | acute (deg) | area (m²) | role | |---|---|---|---|---|---| | 1 | 9 | 1012 | 89.07 | 1.025 | equatorial near-square — **GOVERNS plate bending** | | 2 | 16 | 1022 | 69.72 | 0.979 | wall mid-band | | 3 | 9 | 1025 | 61.09 | 0.919 | wall lower-band | | 4 | 10 | 1008 | 61.20 | 0.891 | cap base | | 5 | 2 | 1097 | 42.54 | 0.813 | door-region elongated | | 6 | 10 | 814 | 58.04 | 0.561 | wall sub-band | | 7 | 2 | 737 | 76.76 | 0.528 | door-region | | 8 | 10 | 1009 | 31.16 | 0.526 | apex narrow rhombi | | 9 | 2 | 729 | 73.88 | 0.511 | door-region | Confirms the building is an **N = 9 polar zonohedron** with multiple latitude rings. --- ## 3. Code map ``` zomestruct/ ├── src/zomestruct/ │ ├── geometry/ │ │ ├── polygon.py # Polygon, Rhombus, fit_rhombus, cluster_rhombi │ │ ├── panel_dxf.py # parse Rhino DXF cut-sheets │ │ └── assembly_obj.py # streaming parser for the 1.5–2 GB assembly OBJs │ ├── material/pu_foam.py # ZOMES_PU_LAB + safety factors + allowables │ ├── loads/asce7.py # ASCE 7-22 wind/snow, baseline + severe presets │ ├── checks/ │ │ ├── result.py # CheckResult dataclass │ │ ├── plate_theory.py # Timoshenko SS rect-plate (β table for ν=0.3) │ │ └── structure.py # plate-bending, joint, membrane, buckling, bearing │ ├── fea/ │ │ ├── mesh.py # gmsh single-panel + spherical-cap meshers │ │ ├── solver.py # scikit-fem linear-elastic 3D-tet solver │ │ ├── obj_assembly.py # 1.5 GB OBJ → per-panel .npz files │ │ ├── panel_fit.py # PCA → rhombus corners + averaged normals │ │ ├── assembly_mesh.py # full-dome OCC assembly + tet mesh (LIMITED, see § 7) │ │ └── calculix.py # CalculiX (.inp / .frd) integration │ └── report.py # text report renderer └── tools/ ├── parse_panels.py # walk all OFC-* DXFs, cluster rhombi ├── parse_assembly.py # bbox / parts breakdown of a multi-GB OBJ ├── extract_panels_from_obj.py # streaming → reports/panels_npz/panel_NNN.npz ├── fit_panels.py # PCA per panel → rhombus + normal ├── inspect_panel_dxf.py # debug a single DXF ├── run_check.py # hand-calc (Timoshenko + ASCE 7) → reports/sanity-check-*.txt ├── run_full_analysis.py # hand-calc + Tier 1 panel FEA + Tier 2 dome FEA ├── fea_validate_square.py # Tier 1 FEA convergence vs Timoshenko square plate ├── fea_tier1_panel.py # single rhombic panel FEA ├── fea_tier2_dome.py # spherical-cap dome FEA (membrane proxy) ├── build_assembly_mesh.py # 70-panel assembly mesher (limited) ├── solve_assembly.py # scikit-fem solve on the assembly mesh ├── ccx_crosscheck.py # CalculiX linear elastic on the assembly mesh └── ccx_nonlinear.py # CalculiX with Drucker-Prager, ramped load ``` --- ## 4. Methods + software ### 4.1 Hand calc (the trusted backbone) - **Plate bending:** Timoshenko & Woinowsky-Krieger Theory of Plates and Shells 2e, Table 8 (SS rectangular plate, uniform pressure). β interpolated from b/a = 1.0…∞ at ν = 0.30. Rhombic panels treated as the inscribed rectangle on their two diagonals (conservative for skinny rhombi). Code: [`src/zomestruct/checks/plate_theory.py`](../src/zomestruct/checks/plate_theory.py). - **Joint shear / tension:** equal-edge sharing of suction over panel area; bond area = edge × thickness; check vs lab joint allowables with FoS = 5. - **Membrane base compression:** total dead + snow vertical load distributed over base-ring panels; section = thickness × edge. - **Local panel buckling:** classical k = 4 SS plate buckling, σ_cr = 4π²E/(12(1−ν²)) · (t/b)². - **Global shell snap-through:** Timoshenko spherical-cap, σ_cr = 2E(t/R)²/√(3(1−ν²)). - **Foundation bearing:** total vertical / footprint area, vs typical 100 kPa. ASCE 7-22 loads, simplified for a small dome (Ch. 7 + 27/30): - baseline preset = Risk Cat II, V = 115 mph, p_g = 30 psf, Exposure C - severe preset = Risk Cat II, V = 160 mph, p_g = 100 psf, Exposure D - C&C envelope GC_p ranges from −2.6 (worst suction) to +1.5 (worst inward) ### 4.2 In-house FEA (scikit-fem on gmsh tetrahedra) - **Tier 1** — single-panel rhombic prism, 76.2 mm thick, simply-supported boundary conditions on the 4 side faces (Z fixed, in-plane corner pin to remove rigid-body modes). Validation against the Timoshenko square-plate analytical: deflection error < 4 % at mesh size 35 mm, 1 layer through thickness; centre-fibre stress error < 8 %. **Linear tetrahedra shear-lock in pure plate bending** — beyond the validated mesh size, peak stress diverges. We use FEA only for displacement and report Timoshenko stress as authoritative. - **Tier 2** — full-dome spherical-cap proxy (R = (D²/4 + H²)/(2H) = 2.95 m, t = 76.2 mm, fully clamped rim). Mesher: gmsh OCC sphere − sphere. **Membrane behaviour dominates and is well-captured by linear tets** (centre-region VM matches q·R/(2t) within 17–38 %). - **Tier 3** — full-dome assembly of 70 fitted rhombic prisms (see [§ 7](#7-the-volume-assembly-attempt-and-why-it-doesnt-give-trustworthy-stresses)). Numerically runs but cannot be trusted for stress magnitudes. ### 4.3 CalculiX cross-check CalculiX 2.23 (`/opt/homebrew/Cellar/calculix-ccx/2.23/bin/ccx_2.23`, installed via Homebrew tap). C3D4 (linear tet) elements on the merged-volume mesh in `reports/full_dome_merged.vtu`. - **Linear elastic** runs (gravity, snow, wind uplift) at baseline and severe. - **Nonlinear** with Drucker–Prager plasticity, calibrated from σ_c = 2.47 MPa and σ_t = 0.27 MPa (β = 67.45°, ψ = 33.73°, d = 0.487 MPa, perfect plasticity). Load ramped 1×, 5×, 20×, 30×, 50×, 100× design pressure; collapse bracketed by the highest converging step. Detailed numbers are in [`reports/calculix-analysis.md`](calculix-analysis.md). Headline: **collapse > 50× snow design and > 60× uplift design** at severe site, with first-yield safety factor ≥ 36×. There is a known disagreement (~99 % rel diff on p99 VM) between the in-house scikit-fem solver and CalculiX on the assembly volume mesh — see [§ 7.2](#72-disagreement-between-the-in-house-solver-and-calculix). Resolution will come with shell FEA ([§ 8](#8-in-progress-shell-fea)). ### 4.4 Software stack | Tool | Version | Purpose | |---|---|---| | Python | 3.12.8 | host language | | numpy | 2.4.3 | linear algebra | | scipy | (paired with numpy) | sparse solver, KDTree, optimise | | gmsh | 4.15.2 | mesh generation (Python API + OCC kernel) | | ezdxf | 1.4.3 | DXF cut-sheet parsing | | meshio | 5.3.5 | mesh I/O (.msh, .vtu, .inp) | | scikit-fem | 12.0.1 | in-house finite-element framework | | CalculiX (ccx) | 2.23 | cross-check FEA solver | | ParaView | (any) | viewing `.vtu` outputs | --- ## 5. Existing reports — read these first These files are the canonical record of what has been DONE. Order is roughly chronological. | Report | Description | |---|---| | [`reports/sanity-check-baseline.txt`](sanity-check-baseline.txt), [`reports/sanity-check-severe.txt`](sanity-check-severe.txt) | First-pass hand-calc; one-way-slab plate model (later replaced) | | [`reports/full-analysis-baseline.txt`](full-analysis-baseline.txt), [`reports/full-analysis-severe.txt`](full-analysis-severe.txt) | Hand-calc + Tier 1 + Tier 2 results (Timoshenko-based plate stress) | | [`reports/calculix-analysis.md`](calculix-analysis.md) | CalculiX linear + nonlinear on the assembly **volume** mesh (C3D4); collapse > 50× design | | [`reports/2026-05-04--shell-fea-from-scratch.md`](2026-05-04--shell-fea-from-scratch.md) | **In-house pure-Python DKT + CST + drilling shell FEA** on dome mid-surface | | [`reports/2026-05-04--calculix-shell-fea.md`](2026-05-04--calculix-shell-fea.md) | **CalculiX S3 shell FEA** on the same mid-surface mesh — independent cross-check | | `reports/fea_panel_*.vtu` | Tier 1 single-panel FEA, all load cases | | `reports/fea_dome_*.vtu` | Tier 2 spherical-cap FEA, all load cases | | `reports/fea_assembly_*.vtu` | Tier 3 70-panel assembly FEA (scikit-fem volume mesh) — magnitudes not trustworthy | | `reports/shell_dome_*.vtu` | In-house shell FEA results (mid-surface) | | `reports/shell_validate_*.vtu` | In-house shell FEA validation against Timoshenko square plate | | `reports/ccx_shell/*.{inp,frd,vtu}` | CalculiX S3 shell decks + results | | `reports/ccx/*.{inp,frd}` | Earlier CalculiX volume-mesh runs (linear + nonlinear) | | `reports/full_dome_merged.vtu`, `reports/full_dome.msh` | 20 187-node / 57 725-tet merged volume mesh (volume FEA only) | | `reports/full_dome_midsurface.vtu` | 4 639-node / 8 960-triangle mid-surface mesh (shell FEA) | | `reports/panels_npz/panel_NNN.npz` | 82 per-panel surface meshes, dedup'd; the data input to all panel-fitting code | | **THIS FILE** ([`2026-05-04--zomestruct-project-overview.md`](2026-05-04--zomestruct-project-overview.md)) | **Top-level catalog and reading guide** | --- ## 6. Reproduction Each tool has a CLI in `tools/`. From the project root: ```bash # Geometry parsing python3 tools/parse_panels.py # rhombus inventory across all DXFs python3 tools/parse_assembly.py # bbox + part stats from full assembly OBJ python3 tools/extract_panels_from_obj.py # 1.5 GB OBJ -> 82 .npz files python3 tools/fit_panels.py # PCA per panel -> 9 unique rhombus types # Hand-calc + Tier 1/2 (the trusted analyses) python3 tools/run_check.py severe # ASCE 7 severe envelope python3 tools/run_check.py baseline # ASCE 7 baseline CONUS python3 tools/run_full_analysis.py severe # adds Tier 1 + Tier 2 FEA python3 tools/run_full_analysis.py baseline # Tier 1 (single rhombic panel) python3 tools/fea_validate_square.py # convergence vs Timoshenko python3 tools/fea_tier1_panel.py # all load cases on the worst panel # Tier 2 (spherical-cap dome proxy) python3 tools/fea_tier2_dome.py severe python3 tools/fea_tier2_dome.py baseline # Tier 3 (70-panel assembly volume mesh — see § 7) python3 tools/build_assembly_mesh.py 100 # mesh size in mm python3 tools/solve_assembly.py severe reports/full_dome_merged.vtu # CalculiX cross-check python3 tools/ccx_crosscheck.py gravity baseline python3 tools/ccx_crosscheck.py snow severe python3 tools/ccx_crosscheck.py uplift severe python3 tools/ccx_nonlinear.py snow severe 50.0 # collapse search python3 tools/ccx_nonlinear.py uplift severe 60.0 ``` --- ## 7. The volume-assembly attempt and why it doesn't give trustworthy stresses ### 7.1 What was attempted Build the actual 70-panel polar-zonohedron geometry as a single tet-meshed solid, then run linear FEA on it. Pipeline: 1. Stream-parse `structural-full-office.obj` → 82 per-panel .npz files (`tools/extract_panels_from_obj.py`). 1.5 GB → 82 × ~88 k vertices in 54 s. 2. PCA-fit each panel → centroid, normal, two in-plane axes, edge length, acute angle ([`tools/fit_panels.py`](../tools/fit_panels.py)). Identifies 70 rhombic panels (9 unique types) and 12 non-rhombic (foundation curb strips + door framing). 3. Build a global corner-deduplication network using KDTree + union-find, with a per-panel guard so that no two corners of the same panel can collapse into one cluster ([`src/zomestruct/fea/assembly_mesh.py`](../src/zomestruct/fea/assembly_mesh.py) :: `build_corner_network`). At dedup_tol = 50 mm, 280 raw corners → 166 unique → 1.69 panels per corner on average. 4. Build the OCC geometry: 70 panels of 8 corners each. Top/bottom corners are **shared via averaged-normal extrusion** (each shared corner has a single "averaged normal" derived from all panels touching it; the ±t/2 offset uses that average). Side faces between adjacent panels are split into two triangles along a deterministic diagonal so both panels produce the SAME triangle in OCC. 5. Outer surface = triangles used by exactly 1 panel (top/bot fan triangles + boundary side faces). Inner = triangles used by 2 panels (interior shared side faces). ### 7.2 Disagreement between the in-house solver and CalculiX Both ran on the same merged tet mesh (`reports/full_dome_merged.vtu`, 20 187 nodes / 57 725 tets, foundation BC = encastre on y < 50 mm). | Case | metric | scikit-fem (in-house) | CalculiX | rel diff | |---|---|---|---|---| | gravity baseline | p99 ‖u‖ mm | 11.93 | 6.89 (max) | 42 % | | gravity baseline | p99 VM MPa | 1.54 | 0.047 | 97 % | | snow baseline | p99 VM MPa | 6.55 | 0.056 | 99 % | The two solvers should agree to <5 %. They disagree by ~97 %. Best current understanding: - **CalculiX** treats the C3D4 mesh as a bonded continuous solid through the whole envelope, including across what should be panel-to-panel joints. Its linear stress is realistic for a continuous shell and matches Tier 2 spherical-cap order-of-magnitude. Its nonlinear collapse loads are far above design (≥ 50× snow design at severe site). - **scikit-fem** sees the same mesh but for unclear reasons reports much higher peak stresses — possibly because of element orientation conventions or stress recovery differences. This is suspected, not yet proven; mesh reorientation only flipped 17 / 57 725 tets, which can't explain the gap. - The merged assembly mesh has **slivers and very thin tets at corner-merge points** (post-merge sliver filter drops volumes < 1 % of median). Even after filtering, residual mesh artefacts disproportionately affect peak-stress recovery in the in-house solver but not CalculiX. - **Linear tets shear-lock** in pure plate bending; a key part of the dome's response is precisely that. Both solvers underpredict bending stress on the LARGEST panels — only Timoshenko gives the correct stress for that mode. The honest position taken by [`reports/full-analysis-baseline.txt`](full-analysis-baseline.txt) and [`reports/full-analysis-severe.txt`](full-analysis-severe.txt) is: **use Timoshenko per-panel + spherical-cap Tier 2 for global membrane + CalculiX nonlinear for collapse**. Do NOT use scikit-fem assembly-mesh stresses as engineering numbers. The in-house volume-mesh assembly is retained as a geometry/visualisation pipeline. ### 7.3 Geometry-level limitation of the volume mesh A separate, deeper problem surfaces if you try the *most physically correct* volume-mesh strategy (averaged-normal extrusion + shared corners + fan-triangulated top/bottom): - The averaged-normal corner positions are not coplanar with each panel's own top plane. A panel's "top face" becomes a 4-corner non-planar quad. Splitting into 2 triangles + a 4-flap fan from a panel-specific centroid keeps each face planar, but adjacent panels' top fans **self-intersect in 3D** at sharp dihedral angles. - Both gmsh's Delaunay 3D and HXT mesh algorithms reject the input as non-PLC ("a segment and a facet intersect at point"). - Neither tighter dedup tolerances nor tighter OCC fix flags resolve this — the geometry asks for elements that are **inherently 2D in the panel mid-surface**, i.e. **shell elements**. ### 7.4 Recommendation, validated repeatedly For magnitude-trustworthy assembly FEA, the path is **shell elements on the panel mid-surface mesh**. Adjacent panels naturally share edges (no overlap), no shear locking, no PLC errors. This is the work being done in [§ 8](#8-in-progress-shell-fea). --- ## 8. Shell FEA (completed 2026-05-04) Two independent implementations on the same dedup'd mid-surface mesh (89 unique corners → 8 960 triangles, 4 639 nodes): 1. **In-house pure-Python DKT shell** — full report: [`2026-05-04--shell-fea-from-scratch.md`](2026-05-04--shell-fea-from-scratch.md). Validated within ~12–15 % of Timoshenko square-plate solution. 2. **CalculiX S3 shell** — independent reference, full report: [`2026-05-04--calculix-shell-fea.md`](2026-05-04--calculix-shell-fea.md). Industry-validated thin-shell element. Both agree on the engineering conclusion: - **Severe US (160 mph wind, 100 psf snow):** C&C peak wind suction fails plate bending at the largest panels (D/C max 1.83 in CCX shell, 2.80 in in-house DKT — bracket). - **Baseline CONUS (115 mph, 30 psf snow):** all load cases pass with margin (D/C max ≤ 1.19 in-house, ≤ 0.71 CCX). - The dome's GLOBAL membrane response is well within allowable; the governing failure is *local* per-panel bending at the largest equatorial / upper-cap rhombi. - This matches Timoshenko per-panel (D/C 1.58 severe, 0.66 baseline) within ~15–25 %. The mid-surface mesh + shell pipeline is now the **trusted assembly-FEA path**. The 70-panel volume mesh attempt ([§ 7](#7-the-volume-assembly-attempt-and-why-it-doesnt-give-trustworthy-stresses)) is documented but not used for engineering numbers. --- ## 9. Glossary - **Polar zonohedron** — a class of zonohedron with a single polar axis; faces are rhombi whose edges are parallel to one of N axis-vectors arranged around the polar axis. Produces N-fold rotational symmetry. The Zomes office is N = 9. - **Rhombic panel** — a four-sided foam panel whose four edges have equal length; characterised by edge length and acute angle (or equivalently, the two diagonals). - **C&C** (Components and Cladding) — ASCE 7 nomenclature for local pressure peaks, used for individual panel checks. Distinct from MWFRS (Main Wind Force Resisting System), which is the whole-envelope average used for global structural response. - **D/C** (Demand-to-Capacity Ratio) — the ratio of working stress to allowable stress at the limit state being checked. ≤ 1.0 means PASS. - **DKT** (Discrete Kirchhoff Triangle) — a thin-plate triangular finite-element formulation that satisfies the Kirchhoff normality constraint discretely at midside nodes; used widely in commercial shell FEA. - **Drucker–Prager** — a pressure-dependent yield surface used for cellular materials, calibrated from compressive and tensile strengths. Used in the CalculiX nonlinear runs. - **HXT** — gmsh's parallel 3D Delaunay mesh algorithm (faster + slightly more robust than the default). - **OCC** (OpenCASCADE) — gmsh's CAD kernel for boolean operations and parametric geometry. - **PCA** (Principal Component Analysis) — used here to fit a plane + two orthonormal in-plane axes through each panel's surface vertices. - **PLC error** — gmsh's complaint that the input piecewise-linear surface complex has self-intersections. - **Shell element** — a 2D finite element living in 3D space, with its mid-surface meshed; combines membrane (in-plane) and bending behaviour. The natural element for thin-walled structures like our dome. - **Timoshenko square-plate solution** — the classical analytical answer for an SS rectangular plate under uniform pressure; β coefficient depends on aspect ratio. The ground truth we use to validate Tier 1. --- *end of overview*