# 2026-05-05 — Phase B.2 production sweep with finite-stiffness joints **Plan:** `docs/plans/2026-05-05-finite-stiffness-joints.md` **Phase B.1 precursor:** `reports/2026-05-05--phase-b1-infrastructure-test.md` **Prior convergence study:** `reports/2026-05-05--shell-convergence-study.md` **Tools (new in this commit):** * `tools/solve_shell_jointed_opensees.py` — production sweep driver (5 stiffness × 3 case-pressures × 2 sites = 30 runs) * `tools/jointed_convergence_study.py` — mesh-refinement convergence at calibrated stiffness on the controlling load case **Data products:** * `reports/opensees_shell_jointed_baseline_forces.csv` (1 050 rows) * `reports/opensees_shell_jointed_severe_forces.csv` (1 050 rows) * `reports/jointed_convergence_study.csv` * `reports/full-analysis-shell-jointed-baseline.txt` * `reports/full-analysis-shell-jointed-severe.txt` --- ## Headline **Finite-stiffness rotational springs alone do NOT resolve the mesh-refinement divergence on the controlling `wind_cc_peak` load case** — the calibrated-joint MITC4 sweep drifts +74 % over the same n_div=2..8 schedule that drifted +24 % under rigid joints. The kink- line singularity is unchanged in character on a membrane-dominated load. **However, the stiffness sweep on the production mesh confirms the B.1 hypothesis:** the bending-dominated `snow` load case IS sensitive to joint stiffness (+23 % free-hinge / rigid ratio at baseline), while the membrane-dominated `wind_cc_peak` case shows essentially zero sensitivity (free/rigid ratio = 1.00 baseline, 1.04 severe). Wind_mwfrs sits in between but closer to membrane-dominated. **Worst plate-bending D/C at calibrated joint stiffness on the production mesh:** * baseline: panel 64, wind_cc_peak — **D/C = 0.807** (was 0.816 rigid) * severe: panel 64, wind_cc_peak — **D/C = 1.884** (was 1.908 rigid) These match the pre-jointed OpenSees-MITC4-only result to within 1 %; they do NOT change the EOR's controlling check, which on the *envelope* (in-house DKT + MITC4 envelope per `reports/opensees-full-check-baseline.txt`) sat at D/C ≈ 1.16 driven by the in-house DKT solver. The envelope's worst-panel result is not made better by finite-stiffness joints under wind_cc_peak — because that load case isn't where joint compliance matters. --- ## Section 1 — Mesh-refinement convergence verdict The `wind_cc_peak baseline` load case (p = −3 831 Pa) was run with calibrated PuFoam joint stiffness `k_phi/L = 612 N·mm/rad/mm` (`material/joint.py` default) at four mesh densities, n_div ∈ {2, 4, 6, 8}. Spring stiffness was distributed across the `(n_div − 1)` interior edge-midpoint nodes per inter-panel edge so the *total* stiffness across each bond `k_phi/L · L_edge` is invariant under refinement (i.e. springs are properly subdivided, not multiplied). | n_div | n_nodes | n_quads | n_joint_pairs | u_max (mm) | σ_b_max (MPa) | runtime (s) | Δu (vs prev) | |------:|--------:|--------:|--------------:|-----------:|--------------:|------------:|-------------:| | 2 | 630 | 280 | 311 | 29.817 | 0.4685 | 0.24 | n/a | | 4 | 1 750 | 1 120 | 551 | 41.958 | 0.6820 | 0.48 | **+40.7 %** | | 6 | 3 430 | 2 520 | 791 | 47.824 | 1.0678 | 1.95 | **+14.0 %** | | 8 | 5 670 | 4 480 | 1 031 | 51.912 | 1.5088 | 4.33 | **+8.6 %** | **Total drift n_div=2 → n_div=8: u_max +74 %, σ_b_max +222 %.** For comparison, the prior rigid-joint study's MITC4 leg on the same load case and same sweep gave +24 % u_max drift (29.83 → 36.64 mm) — see `reports/2026-05-05--shell-convergence-study.md`. ### Verdict **FAIL — finite springs alone do NOT resolve the convergence-divergence on `wind_cc_peak`.** The drift per refinement step IS decaying (40.7 → 14.0 → 8.6 %), so the spring-coupled mesh may be approaching a finite limit at infinite refinement (vs the prior CCX S3 study, where the per-step delta stayed flat at +73 % per refinement step — clear unbounded divergence). But the magnitude of drift across the practical refinement window is *larger* under finite joints than under rigid joints. Two mechanisms: 1. **Finite joints are softer than rigid joints under any load.** At every n_div, the spring-coupled mesh predicts a higher u_max than the rigid-coupled mesh — that's the whole point of the finite-stiffness model. So the *baseline* of the convergence curve shifted up. 2. **Refinement adds more spring nodes per edge.** At n_div=2 each edge has 1 interior spring; at n_div=8 it has 7. Even when the total stiffness is conserved, the *distribution* of compliance along the edge changes: more spring DOFs = more degrees of freedom for the bond to deform = more deflection captured. This compounds with the ordinary kink-line bending that all shell formulations see. The **`wind_cc_peak` load is membrane-dominated** (Section 2 below shows free/rigid u_max ratio ≈ 1.00 — joints essentially do no work under this load). The "convergence divergence" the prior study documented is therefore a *kink-line bending stress concentration* phenomenon, not a *joint compliance* phenomenon. Finite springs fix the joint compliance physics correctly but do not address the underlying kink-line singularity, which is geometric (the CAD's infinite-stiffness folds between flat panel facets) and orthogonal to bond stiffness. ### What WOULD likely converge A bending-dominated load case (e.g. `snow`) on a calibrated-joint mesh probably DOES converge across refinement, because the load finds the joint compliance and the per-panel bending stays modest. Verifying this would require re-running the convergence sweep under snow loading; it is plausible from the magnitudes in Section 2 (snow's u_max grows by ~17 % free/rigid ratio at the n_div=2 mesh, vs wind_cc_peak's ~0 %, so the bending portion of the total deflection IS dominated by joints in the snow case). Out of scope for this report; documented as future work. ### What WOULD likely converge cleanly: the smooth-cap case Per `reports/2026-05-04--smooth-cap-4way.md`, every shell formulation agrees within ±7 % on a *non-faceted* spherical cap at the standard mesh. The convergence-divergence is a property of the faceted-dome geometry, not the shell formulation. The finite-stiffness joint replaces the *physics* at each edge but not the *geometry* — a finite-radius fillet (radius ~10–25 mm, the actual glue bead size) modeled as a strip of shell elements between the flat panels would resolve the kink-line geometry, and that is the future-work path the prior convergence-study recommendations list as "path #1". --- ## Section 2 — Stiffness sweep summary per site Five stiffness values were run on the production n_div=2 mesh (280 quads, 70 panels) for every (load case, site) combination. ### Baseline site | k_phi/L (N·mm/rad/mm) | snow u_max (mm) | wind_mwfrs u_max (mm) | wind_cc_peak u_max (mm) | |----------------------:|----------------:|----------------------:|------------------------:| | 0 (free hinge) | 10.698 | 11.110 | 30.105 | | 100 | 10.593 | 11.115 | 29.747 | | 612 (calibrated) | 10.192 | 11.139 | 29.817 | | 5 000 (calib × 8) | 9.214 | 11.206 | 30.018 | | 1e6 (rigid) | 8.674 | 11.251 | 30.157 | Hypothesis-test summary (free/rigid u_max ratio, larger = more bending-dominated): | case | u_rigid (mm) | u_free (mm) | u_calib (mm) | free/rigid | calib/rigid | |---------------|--------------:|-------------:|-------------:|-----------:|------------:| | snow | 8.674 | 10.698 | 10.192 | **1.233** | 1.175 | | wind_mwfrs | 11.251 | 11.110 | 11.139 | 0.987 | 0.990 | | wind_cc_peak | 30.157 | 30.105 | 29.817 | 0.998 | 0.989 | ### Severe site | k_phi/L (N·mm/rad/mm) | snow u_max (mm) | wind_mwfrs u_max (mm) | wind_cc_peak u_max (mm) | |----------------------:|----------------:|----------------------:|------------------------:| | 0 | 30.458 | 25.876 | 73.544 | | 100 | 30.101 | 25.868 | 72.571 | | 612 | 28.728 | 25.928 | 69.756 | | 5 000 | 26.058 | 26.102 | 70.244 | | 1e6 | 26.197 | 26.221 | 70.582 | Hypothesis-test summary: | case | u_rigid (mm) | u_free (mm) | u_calib (mm) | free/rigid | calib/rigid | |---------------|--------------:|-------------:|-------------:|-----------:|------------:| | snow | 26.197 | 30.458 | 28.728 | **1.163** | 1.097 | | wind_mwfrs | 26.221 | 25.876 | 25.928 | 0.987 | 0.989 | | wind_cc_peak | 70.582 | 73.544 | 69.756 | 1.042 | 0.988 | ### What the ratios mean * **`snow`** is the only case where joints meaningfully change the dome's stiffness. Free hinge gives 23 % more deflection than rigid (baseline) / 16 % more (severe). Calibrated joints give 18 % / 10 % more. **`snow` is the bending-dominated case** — uniform downward pressure puts the dome's apex in compression and the rim in moment, and the moment flow needs bond torsion to traverse panel-to-panel folds. * **`wind_mwfrs`** (uniform uplift, MWFRS) shows essentially zero joint sensitivity. The pressure pulls the dome up uniformly — pure membrane response — and the springs do no work. Both ratios are *below* 1.0 (rigid is *more compliant* than free hinge by ~1 %); this is a small numerical artefact of the spring-coupled topology, not physical softening. * **`wind_cc_peak`** (negative-pressure uplift, components-and- cladding peak suction) also membrane-dominated — ratios near 1.0. The 4 % free/rigid ratio at severe is the largest of the wind cases, but still a small effect. The B.1 hypothesis is **CONFIRMED**: bending-dominated cases (snow) ARE joint-sensitive; membrane-dominated cases (wind) are NOT. ### Worst-panel D/C bending envelope per stiffness Same panel (panel 64) and same case (wind_cc_peak) win at every stiffness — the worst panel does not change as joints soften. | k_phi/L | baseline σ_b (MPa) | baseline D/C | severe σ_b (MPa) | severe D/C | |--------:|-------------------:|-------------:|-----------------:|-----------:| | 0 | 0.4362 | 0.804 | 1.0190 | 1.878 | | 100 | 0.4365 | 0.805 | 1.0196 | 1.880 | | 612 | 0.4375 | **0.807** | 1.0222 | **1.884** | | 5 000 | 0.4406 | 0.812 | 1.0296 | 1.898 | | 1e6 | 0.4428 | 0.816 | 1.0349 | 1.908 | The D/C bending changes by **±1 % across the entire stiffness sweep** under the controlling wind_cc_peak case. Joint stiffness uncertainty (the ±2× t_bond range that drives `k_phi` ±4×) is *not* the dominant uncertainty in the dome's plate-bending D/C on this load case. The dominant uncertainty is the kink-line singularity (Section 1), which is geometric. --- ## Section 3 — Comparison to the rigid-joint baseline ### MITC4-only D/C The Phase B.1 production-mesh result (`solve_static_shell_quad`, no springs) at n_div=2 gave: * baseline wind_cc_peak: u_max = 30.16 mm, σ_b_max = 0.4428 MPa, D/C(b) = 0.816. * severe wind_cc_peak: u_max = 70.58 mm, σ_b_max = 1.0349 MPa, D/C(b) = 1.908. The k_phi/L = 1e6 row of this Phase B.2 production sweep recovers those values exactly (to 4 decimal places of D/C). The k_phi/L = 612 row shifts D/C bending by ≤ 1 %. So **on the n_div=2 production mesh, calibrated joints do not change the MITC4-only worst-panel D/C bending result.** They also do not change *which* panel wins (panel 64) or *which* load case wins (wind_cc_peak). ### Envelope D/C (the EOR's actual reported number) The EOR's reported worst-panel plate-bending D/C of **1.16** (severe site, wind_cc_peak, panel 58) is an *envelope* across two shell solvers (in-house CST+DKT and OpenSees MITC4) per `reports/opensees-full-check-baseline.txt`. The in-house DKT predicts much higher bending stress than MITC4 on every panel; the envelope is dominated by the DKT solver: ``` [PLATE BENDING] panel 58, wind_cc_peak: D/C = 1.163 inhouse_dkt: 0.379 (severe)... wait, DKT 1.163, MITC4 0.162 [FAIL] ``` (That comma was reading `inhouse_dkt: 1.163 opensees_mitc4: 0.162`.) So the envelope D/C of 1.16 is set by `inhouse_dkt`, not MITC4. Phase B.2 only ran the OpenSees side (in-house DKT jointed is explicitly out of scope for B.2). **The Phase B.2 calibrated-joint MITC4 result does not change the envelope D/C on its own.** What WOULD lower the envelope is a finite-stiffness in-house DKT (the missing leg), if the in-house solver were extended to accept spring constraints. That is documented future work in the plan; the OpenSees-only convergence verdict here (Section 1) suggests it would not necessarily help under wind_cc_peak anyway, because the load is membrane-dominated. ### Per-panel D/C delta map (calibrated vs rigid, baseline site) The CSV `reports/opensees_shell_jointed_baseline_forces.csv` contains 5 stiffness × 70 panels × 3 cases = 1 050 rows per site. For the bending-dominated `snow` case, calibrated-vs-rigid σ_b_max change is panel-dependent: most panels see ≤ 1 % change, a small number of high-stress panels under snow see up to 5 % softening as the springs allow load redistribution. For `wind_cc_peak` and `wind_mwfrs`, σ_b_max is unchanged within 1 % at every panel, consistent with the global u_max insensitivity documented in Section 2. --- ## Section 4 — Implications for the EOR ### Does calibrated-joint result agree with hand-calc D/C = 0.99 better or worse? The hand-calc panel-bending D/C of 0.99 (severe site, wind uplift, single panel, simply supported) is a *panel-level* check that bypasses the multi-panel kink-line geometry entirely. It does not care whether joints are rigid or finite — it analyzes one panel as a flat plate under the case's controlling pressure. The Phase B.2 MITC4-only result of D/C(b) = 1.88 (severe, wind_cc_peak) is *higher* than the hand-calc 0.99 — but that gap is dominated by the kink-line singularity, not by joint stiffness. The convergence study (Section 1) shows D/C goes from 0.857 (n_div=2) to 2.78 (n_div=8) on the same load and material; hand-calc is bracketed by these and consistent with neither end of the FE convergence curve. **Calibrated joints do not move the FE D/C closer to the hand-calc D/C in any meaningful way** — the gap is geometric (kink-line), not physical (joint compliance). The hand-calc D/C remains the correct EOR-acceptable result for this load case, on the same grounds as the prior convergence study's recommendation. ### Does finite joints quantify the load-sharing argument? The B.1 hypothesis was that PuFoam joints don't soften the dome much because rigid corners stitch panels together at every vertex, so even modest membrane stiffness keeps the response close to rigid. Phase B.2 confirms this for `wind_cc_peak` and `wind_mwfrs` (both ≤ 4 % free/rigid u_max change) but shows it's NOT true for `snow` (free/rigid = 1.16–1.23 — joints do meaningful work under bending-dominated loads). So the load-sharing argument is **load-case-dependent**: * For wind cases (the controlling cases for severity), joints effectively don't redistribute load — the dome carries everything through membrane. R2 reconciliation (treating joints as rigid) is essentially correct under these loads, with sub-1 % softening available from finite stiffness. * For snow, joints DO redistribute load — by ~10–18 % softening at calibrated stiffness. R2's rigid-joint assumption is conservative under snow (slightly *over*-predicting the dome's effective stiffness, which moves D/C tension/compression in the slightly- unsafe direction; but D/C bending is essentially flat regardless). ### Is t_bond uncertainty the dominant uncertainty? **No.** Across the 5-stiffness sweep (k_phi/L = 0 to 1e6, spanning the full free-hinge → rigid range plus the calibrated ±8× envelope around 612), the worst-panel plate-bending D/C changes by ≤ 1.5 % under the controlling wind_cc_peak case, on both sites. **Joint-stiffness uncertainty is NOT the dominant uncertainty in the dome's bending D/C.** The dominant uncertainty (per Section 1's mesh-refinement convergence verdict) is the **kink-line singularity** — the same mesh-density choice that drives FE-vs-FE solver disagreement (prior convergence study) drives a much larger spread in predicted D/C (0.86 → 2.78 across n_div=2..8 at a single stiffness) than the entire stiffness sweep does at a fixed mesh density (0.80 → 0.82). ### Net implication * **For sign-off:** the EOR's hand-calc-driven decision path remains the right one. The FE result, with or without finite joints, is dominated by mesh-resolution / kink-line geometry, not by joint compliance. * **For future analytic refinement:** the next physically- motivated step is to model the panel-to-panel joints as a finite-radius *fillet* (a strip of shell elements with the bond's E and a radius matching the actual glue bead, ~10–25 mm), which would resolve the kink-line geometry. This is "path #1" in the prior convergence study's recommendation list. Phase B.2 has now verified that springs alone don't fix the divergence, so the next iteration must address the geometry. * **For the report appendix:** the calibrated-joint result tightens the bound on serviceability (deflection) under bending-dominated loads — snow `u_max` softens by ~16–23 % with calibrated joints, which is relevant to deflection limits and aesthetics. Under the governing wind cases, the calibrated-joint result is unchanged from the rigid-joint result. --- ## Files * `tools/solve_shell_jointed_opensees.py` — production sweep driver * `tools/jointed_convergence_study.py` — mesh-refinement convergence * `reports/opensees_shell_jointed_baseline_forces.csv` — per-panel forces for baseline site (5 stiffness × 70 panels × 3 cases) * `reports/opensees_shell_jointed_severe_forces.csv` — per-panel forces for severe site * `reports/jointed_convergence_study.csv` — 4-row convergence table * `reports/full-analysis-shell-jointed-baseline.txt` — captured stdout * `reports/full-analysis-shell-jointed-severe.txt` — captured stdout * `reports/2026-05-05--phase-b2-production-sweep.md` — this document