The carbon cost of seismic resilience
Gravity-only versus seismic-aware form-finding of concrete shells: 168 sized designs, their A1-A3 carbon, and an interactive explorer.
Live explorer · Key finding · Quick start · Verification · Pre-registration · Paper · Cite
How much embodied carbon does seismic resilience cost in a form-found concrete shell, and does form-finding that includes seismic loads deliver it more cheaply than thickening a gravity-only shape?
ShellForm extends the seismic form-finding of Michiels & Adriaenssens (2017, 2018) by sizing each form to pass code checks and counting its A1-A3 embodied carbon. It is built on the validated, tagged modules of ShellBench and never copies a ShellBench value (data contract).
In 79 of 84 cells the two strategies differ in carbon by less than 5 % ("no meaningful difference", pre-registration section 7).
The other 5 cells (10 m, corner supports, rise 0.15, Sa 0.1-0.5 g) are one 5 mm thickness step next to the buckling limit, and they disappear under every robustness check. Thickness is set by linear buckling (corner supports) or the 50 mm minimum (edge supports), and steel by the minimum ratio; none of these responds to Sa up to 0.6 g. Every number and its source: paper/numbers.md.
| Question | Does seismic-aware form-finding save carbon against a gravity-only form sized for the same seismic level? |
| Design space | 2 spans × 2 support cases × 3 rises × 2 strategies × 7 Sa levels = 168 sized designs |
| Decision rule | Pre-registered: a strategy is cheaper only if it saves 5 % or more (section 7) |
| Record | Code tag freeze-2026-11-09, ShellBench v0.3.0; every number traces to results/ |
| Archive | Zenodo, all versions 10.5281/zenodo.24084110 |
Each shell is form-found as a pin-jointed network in equilibrium (force density method, Schek 1974):
flowchart LR
A[Plan, supports, rise] --> B[Force density<br>form-finding]
B -->|Sa = 0| C[Gravity-only form]
B -->|Sa in ±x, ±y| D[Seismic-aware form<br>midrange of 4 thrust surfaces]
C --> E[CalculiX sizing<br>λ1 ≥ 5, compression, L/300]
D --> E
E --> F[Steel and A1-A3 carbon]
F --> G[5 % decision rule<br>84 paired cells]
Design space. 2 spans (10, 20 m) × 2 supports (4 corners, continuous edges) × 3 rise-to-span ratios (0.10, 0.15, 0.20) × 2 strategies (gravity-only, seismic-aware) × 7 plateau spectral accelerations (0-0.6 g) = 168 sized designs.
All figures are drawn from results/ by script, at full page width, as 600 dpi PNG and vector PDF (figures/README.md; visual system in docs/visual_style.md).
| Fig. 2: what sets the thickness | Fig. 4: what moves carbon |
|---|---|
![]() |
![]() |
Open the live explorer, or explorer/index.html straight from disk; it needs no server and no internet (three.js and the Inter typeface are bundled in explorer/vendor/). Pick a span, support case, rise and Sa level to see both strategies side by side: the form in 3D coloured by how far the seismic-aware form moves from the gravity-only one, carbon and thickness for each, carbon against Sa, and a clickable matrix of all 84 comparisons. Light and dark themes, keyboard control, a shareable link for every view, and a CSV of all 168 designs.
Five checks beside the frozen record; no frozen setting or result changed (notes/day17_verification.md, Fig. S1).
| Check | What it shows | Result |
|---|---|---|
| V1 | Complete sphere under pressure, in the same CalculiX path that sizes every shell | Buckles within 2.0 % (R/t 50) and 1.3 % (R/t 100) of the classical value |
| V2 | Mesh convergence | λ1 changes by at most 0.6 % between 61 and 81 nodes per side |
| V3 | Force density equilibrium | Residual below 2.5e-11 N on all 84 form-finding solves |
| V4 | Shell action | 76-100 % of the strain energy is membrane energy |
| V5 | Formwork | No formwork factor or reuse count can move a verdict across the 5 % rule |
The test suite (tests/) covers form-finding, sizing, carbon, the paper tables and the visual system, and runs on every push.
ShellForm needs Python 3.12, CalculiX (ccx) on the path, and ShellBench installed at the tag pinned in src/shellform/pin.py.
git clone https://github.com/syednafizreja/ShellBench.git ShellBench-pin
git -C ShellBench-pin checkout v0.3.0 # the tag in src/shellform/pin.py
git clone https://github.com/syednafizreja/ShellForm.git
cd ShellForm
pip install -e ../ShellBench-pin --no-deps
pip install meshio
pip install -e . --no-deps
python -m pytestReproduce the study:
python -m shellform.batch # 8 designs (preset smoke8), results/batch_smoke8.csv
python -m shellform.batch --preset all # all 168 designs
python -m shellform.batch --span 10 --supports corners --sa 0.0 0.6 # any subset
python -m shellform.batch --compare-record # also check against the committed results
python scripts/day12_freeze.py # the whole freeze run (about 2 h on 4 workers)
python scripts/day11_figures.py # paper figures (Figs. 1-5)
python scripts/day17_figures.py # Fig. 6 and Fig. S1
python scripts/day17_verification.py # verification checks V1-V5 (about 6 min on 4 workers)
python scripts/day14_paper_tables.py # manuscript tables in paper/tables/
python scripts/day13_explorer_data.py # explorer/explorer_data.js from results/batch_all.csvEvery results row names the ShellBench tag it used.
Long-term reproduction. Exact versions are in environment-lock.yml, checksums of every result and figure in SHA256SUMS, and docs/REPRODUCE.md says how to verify the record without running anything and what to do when a dependency no longer installs.
ShellForm/
├── src/shellform/ form-finding, strategies, sizing, steel, carbon, batch runner, figures
├── scripts/ one script per stage of the study (freeze run, figures, tables, checks)
├── tests/ pytest suite, run in CI on every push
├── results/ the frozen record: every CSV names its ShellBench tag
├── figures/ paper figures, PNG and PDF, with the data behind each
├── explorer/ offline interactive explorer (three.js, no server needed)
├── paper/ manuscript (LaTeX), drafts, tables and the numbers-to-sources map
├── notes/ dated working notes, one per step of the study
├── docs/ pre-registration, data contract, reproduction guide, changelog
├── environment-lock.yml exact software versions of the record
└── SHA256SUMS checksums of every file in results/ and figures/
The study design, the decision rule and the robustness checks were fixed in docs/preregistration.md on 30 Oct 2026, before any design-space run. Every later change is a dated amendment that says why. The full history is in docs/CHANGELOG.md and LOG.md. Rules for changes are in CONTRIBUTING.md.
If you use ShellForm, please cite the archived software (the concept DOI always resolves to the latest version):
@software{hasib_shellform,
author = {Hasib, Syed Nafiz Reja},
title = {{ShellForm}: the carbon cost of seismic resilience in form-found concrete shells},
publisher = {Zenodo},
doi = {10.5281/zenodo.24084110},
url = {https://github.com/syednafizreja/ShellForm}
}Machine-readable metadata: CITATION.cff.
Code: MIT (LICENSE). Bundled third-party files keep their own licences: three.js r128 (MIT, explorer/vendor/three.LICENSE) and the Inter typeface (SIL Open Font License 1.1, assets/fonts/OFL.txt).



