verification: activate the two shell benchmark cases (#106)

The Scordelis-Lo roof and the pinched cylinder had their published
references cited but no recipe, because mesh.block's 2D form is planar
and cannot build a curved patch. Both are now active: the mesh is
written node by node (mesh.node.add / mesh.element.add, the route
docs/verification.md allows), the same cylinder patch the solver's own
benchmarks.rs builds in code, with the quarter/eighth symmetry planes,
the rigid diaphragm and the published load.

- scordelis-lo-roof-shell: 16x16 flat quad4 (MITC4) shells, R = 25,
  t = 0.25, self-weight 90 per area; u_z at the free-edge mid-span
  -0.3024 within 2% (ours -0.29901009815961804, 1.12% low).
- pinched-cylinder: 32x32 flat quad4 shells, R = 300, t = 3, a quarter
  of the unit pinch; u under the load -1.8248e-5 within 2% (ours
  -1.803845342860719e-05, 1.15% low).

Each README carries the generator (so the recipe is reproducible), the
refinement study the tolerance reason cites, and how the reference was
cited before. pinched-hemisphere and mh-twisted-beam now say what they
actually wait for: a doubly curved or helical shell mesh written node
by node, not missing shell elements.
This commit is contained in:
Erkin Alp Güney authored and Irakli Kourtis committed 2026-10-17 07:25:44 -04:00
1 parent a0c7d6ce9d
commit 18be60672b
12 files changed
+2973 -18

No files matched your search

+1 -1
View File
@@ -50,7 +50,7 @@ pressure) is a degree of freedom of the existing DOF framework, not a separate s
| M21 Biomechanics and biomaterials | Soft tissue: Holzapfel–Gasser–Ogden fibre-reinforced hyperelasticity with dispersion, Fung, transversely isotropic models; biphasic and poro-hyperelastic cartilage (M19); active muscle (Hill-type); hydrogel swelling. Bone: density-dependent moduli from CT data, strain-energy-density remodelling (Huiskes, Beaupré). Growth and remodelling by kinematic growth (F = Fe·Fg). Implants and biomaterials (titanium, PEEK, UHMWPE) from the M17 library. Verified against published experiments with their tolerances | planned |
| M22 Design studies | Parameters of the SolidCraft design driven from FieldCraft: parametric sweeps, design of experiments, response surfaces and sensitivities; topology optimisation (SIMP with filters, manufacturing constraints); size and shape optimisation; submodelling (driven boundaries from a global model); uncertainty quantification | planned |
| M23 Wave propagation and ultrasound | Elastic, acoustic and coupled waves from the explicit solver's 1D bar today to guided and ultrasonic waves, by two methods. Finite differences first, for fast 2D (then 3D) ultrasound on regular grids: staggered-grid velocity–stress FDTD (Virieux) and the elastodynamic finite integration technique for solids, the rotated staggered grid for anisotropic media, a k-space pseudospectral scheme for weakly heterogeneous tissue and water, all on grids voxelised from the face-tagged geometry by the LBM's exact voxeliser, with heterogeneous, layered and fluid–solid media, CPML boundaries, threads and the GPU backend; staircased curved boundaries scatter spuriously, so the FD grid is checked against the finite elements on curved parts. Finite elements for curved geometry and coupling with structures: spectral elements (high-order Gauss–Lobatto–Legendre hexes with diagonal mass) on the hex meshes, and a mesh check in elements per wavelength with the dispersion error it implies; absorbing boundaries (convolutional PML, absorbing layers with increasing damping) and infinite media; tone-burst sources (Hann-windowed cycles), point, line and surface excitation, and piezoelectric transducers (M19); anisotropic media (composites, crystals) and viscoelastic, power-law-in-frequency attenuation; fluid–solid interfaces and fluid-loaded plates; ultrasound in water and tissue, nonlinear acoustics (Westervelt, KZK) for focused ultrasound. Guided waves: dispersion curves by semi-analytical finite elements (SAFE) for plates, pipes, rails and layered and anisotropic laminates — Lamb, Rayleigh, Love and SH modes — with phase and group velocities and mode shapes; mode-selective excitation. Output: A-scans and B-scans at sensors, wavefield snapshots, 2D FFT (frequency–wavenumber) for mode identification, and time–frequency diagrams of any signal — short-time Fourier spectrograms, continuous wavelet transforms (Morlet), reassigned spectrograms and smoothed pseudo Wigner–Ville — with the SAFE or Rayleigh–Lamb group-velocity curves overlaid as arrival times, and group velocities extracted from the ridges. GPU paths (M12's backend) for long runs. Verified by Lamb's problem (point load on a half-space), Rayleigh-wave speed, Rayleigh–Lamb dispersion, Love waves in a layer over a half-space, reflection and transmission at interfaces, and published guided-wave measurements | planned |
| Continuous: verification and validation | Every capability checked against theory (closed forms), experiments (published measurements) and published benchmarks (NAFEMS, vendor benchmark and verification manuals such as Abaqus's), each case our own model in `tests/oracle/` with its cited reference and tolerance; `cargo xtask oracle` runs them and writes docs/oracle.md; once a case matches, our result is frozen as a fixture so fidelity cannot regress (docs/verification.md). Runner, fixtures and CI job: done; 26 theory cases (patch tests of every solid element, cantilevers, Lamé in 3D, plane strain and axisymmetric, Kirsch in 3D and plane stress, rotating disc and cylinder, beam frequencies, couplings, explicit waves, impact and J2 plasticity, CDT invariants), 9 published benchmarks (MacNeal–Harder solid tests, Scordelis–Lo with solids, NAFEMS LE1 in 3D and 2D, LE10, FV32) and 9 pending cases with citations (shells, thermal, static plasticity, Taylor bar, CFD); `mesh.block` mapped blocks and 2D patches build their meshes | started |
| Continuous: verification and validation | Every capability checked against theory (closed forms), experiments (published measurements) and published benchmarks (NAFEMS, vendor benchmark and verification manuals such as Abaqus's), each case our own model in `tests/oracle/` with its cited reference and tolerance; `cargo xtask oracle` runs them and writes docs/oracle.md; once a case matches, our result is frozen as a fixture so fidelity cannot regress (docs/verification.md). Runner, fixtures and CI job: done; 62 theory cases (patch tests of every solid element, cantilevers, Lamé in 3D, plane strain and axisymmetric, Kirsch in 3D and plane stress, rotating disc and cylinder, beam frequencies, couplings, explicit waves, impact and J2 plasticity, CDT invariants), 11 published benchmarks (the MacNeal–Harder solid tests, the Scordelis–Lo roof with solids and with shells, the pinched cylinder, NAFEMS LE1 in 3D and 2D, LE10, FV32) and 8 pending cases with citations (the pinched hemisphere and twisted beam shell meshes, thermal, Cook's membrane, Taylor bar, CFD, explicit Hertz contact); `mesh.block` mapped blocks and 2D patches build their meshes, curved shell patches are written node by node | started |
| Continuous: performance | CPU first, deterministic: results never depend on the thread count (fixed partitions, sums in a fixed order; checked by hashing results on 1, 2 and 7 threads). Supernodal left-looking Cholesky (11–15× faster than the column solver on one thread), parallel element matrices, stresses and Lanczos products, explicit element updates and LBM cell blocks on rayon threads (done — `fieldcraft-parallel`, `threads` on the solve commands, `FIELDCRAFT_THREADS`); parallel forward/back substitution and explicit tet4 assembly; GPU paths later, within a stated tolerance of the CPU | started |
| Continuous: desktop and agents | Desktop app (viewport, model tree, commands, control channel, the open design drawn, `ui.capture` of the whole window offscreen: done; toolbar of every capability from the catalogue, ready or coming soon with its milestone, icons drawn with VectorCraft, docs/features.md: done; the Craft-family shell — title bar, workspaces and ribbon drop-downs, browser, context panel, command search, journal timeline, light and dark themes — native file pickers with background opening, drag and drop and recent files, samples and one-click Solve, and an examples gallery of ready-to-solve samples, each checked by a test (docs/examples.md): done; MCP server over stdio, headless or bridged to the app, with read and write roots, docs/mcp.md: done; caps labels in Inter SemiBold; the README's analysis video recorded through MCP by `tools/demo-video`: done; support, load, reference-point and coupling symbols in the viewport and headless renders, with their browser toggles: done; symbols as wireframes, one mark per constrained degree of freedom, a constant size on screen with a size setting, highlighted with their selected definition, concentrated loads drawn over the part: done; selection by picking in the viewport — geometry faces, edges, vertices and bodies, mesh nodes, element faces and elements, box selection, hover, a Target row in command forms, `ui.select`/`ui.selection` and MCP `select`: done; a camera parameter for screenshots, a ribbon that follows the command being run: in progress; the browser build — the same app in a web page with browser file pickers, downloads, drops and autosave to browser storage, deployed to GitHub Pages from each release, docs/web.md: done; in-app updates — a daily check of GitHub Releases, Help › Check for Updates and Reinstall, downloads verified against the release key's signature of SHA256SUMS.txt and swapped in after closing, `app.update.check`, `fieldcraft-cli update`, Reload to update in the browser, docs/updates.md: done), command schema as the public API | started |
+7 -5
View File
@@ -2,7 +2,7 @@
Generated by `cargo xtask oracle` from [`tests/oracle/`](../tests/oracle/); the policy is [verification.md](verification.md). Every case is our own model, built with FieldCraft commands from the problem's published description, and compared with the reference value its `expected.json` cites, within the stated tolerance and for the stated reason. Accepted results are frozen in each case's `fixture.json`: a later change that moves one beyond its band (10⁻⁹ of its size) fails CI even while the reference still passes. No reference value was produced with a commercial product.
**275 of 281 quantities pass** (6 known failure(s)) in 71 active cases: 62 theory, 9 published benchmark, 0 experiment; 10 pending cases wait for capabilities still being built.
**277 of 283 quantities pass** (6 known failure(s)) in 73 active cases: 62 theory, 11 published benchmark, 0 experiment; 8 pending cases wait for capabilities still being built.
## Theory: closed-form solutions, patch tests and mesh invariants
@@ -293,6 +293,8 @@ Generated by `cargo xtask oracle` from [`tests/oracle/`](../tests/oracle/); the
| [nafems-le1](../tests/oracle/nafems-le1/) | σ_yy at D (2, 0) | 92.7 | 92.869 | 0.182% | 1% | pass | matches |
| [nafems-le1-plane-stress](../tests/oracle/nafems-le1-plane-stress/) | σ_yy at D (2, 0) | 92.7 | 92.648 | -0.0559% | 1% | pass | matches |
| [nafems-le10](../tests/oracle/nafems-le10/) | σ_yy at D (2, 0, 0.3) on the loaded face | -5.38 | -5.3339 | 0.857% | 2% | pass | matches |
| [pinched-cylinder](../tests/oracle/pinched-cylinder/) | radial displacement under the load, mid-surface | -1.8248e-5 | -1.8038e-5 | 1.15% | 2% | pass | matches |
| [scordelis-lo-roof-shell](../tests/oracle/scordelis-lo-roof-shell/) | vertical displacement at the midpoint of the free edge, mid-surface | -0.3024 | -0.29901 | 1.12% | 2% | pass | matches |
| [scordelis-lo-roof-solid](../tests/oracle/scordelis-lo-roof-solid/) | vertical displacement at the midpoint of the free edge, mid-surface | -0.3024 | -0.3014 | 0.33% | 2% | pass | matches |
## Sources and tolerances
@@ -359,11 +361,13 @@ Generated by `cargo xtask oracle` from [`tests/oracle/`](../tests/oracle/); the
- **[patch-tet10](../tests/oracle/patch-tet10/)** (theory): Constant-stress patch test, tet10. Source: Irons and Razzaque, 'Experience with the patch test for convergence of finite elements', in Aziz (ed.), The Mathematical Foundations of the Finite Element Method, Academic Press 1972, pp. 557–587; MacNeal and Harder, Finite Elements in Analysis and Design 1 (1985) 3–20, constant-stress loading, p. 14 Table 7. Tolerances — ux: a patch test is passed exactly: the tolerance only admits rounding; uy: a patch test is passed exactly: the tolerance only admits rounding; uz: a patch test is passed exactly: the tolerance only admits rounding; sxx: a patch test is passed exactly: the tolerance only admits rounding; syy: a patch test is passed exactly: the tolerance only admits rounding; szz: a patch test is passed exactly: the tolerance only admits rounding; sxy: a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)
- **[patch-tet4](../tests/oracle/patch-tet4/)** (theory): Constant-stress patch test, tet4. Source: Irons and Razzaque, 'Experience with the patch test for convergence of finite elements', in Aziz (ed.), The Mathematical Foundations of the Finite Element Method, Academic Press 1972, pp. 557–587; MacNeal and Harder, Finite Elements in Analysis and Design 1 (1985) 3–20, constant-stress loading, p. 14 Table 7. Tolerances — ux: a patch test is passed exactly: the tolerance only admits rounding; uy: a patch test is passed exactly: the tolerance only admits rounding; uz: a patch test is passed exactly: the tolerance only admits rounding; sxx: a patch test is passed exactly: the tolerance only admits rounding; syy: a patch test is passed exactly: the tolerance only admits rounding; szz: a patch test is passed exactly: the tolerance only admits rounding; sxy: a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)
- **[patch-wedge6](../tests/oracle/patch-wedge6/)** (theory): Constant-stress patch test, wedge6. Source: Irons and Razzaque, 'Experience with the patch test for convergence of finite elements', in Aziz (ed.), The Mathematical Foundations of the Finite Element Method, Academic Press 1972, pp. 557–587; MacNeal and Harder, Finite Elements in Analysis and Design 1 (1985) 3–20, constant-stress loading, p. 14 Table 7. Tolerances — ux: a patch test is passed exactly: the tolerance only admits rounding; uy: a patch test is passed exactly: the tolerance only admits rounding; uz: a patch test is passed exactly: the tolerance only admits rounding; sxx: a patch test is passed exactly: the tolerance only admits rounding; syy: a patch test is passed exactly: the tolerance only admits rounding; szz: a patch test is passed exactly: the tolerance only admits rounding; sxy: a patch test is passed exactly: the tolerance only admits rounding (stresses of order 1)
- **[pinched-cylinder](../tests/oracle/pinched-cylinder/)** (benchmark): Pinched cylinder with rigid diaphragms. Source: Belytschko, Stolarski, Liu, Carpenter and Ong, 'Stress projection for membrane and shear locking in shell finite elements', Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (the shell obstacle course); reference 1.8248 × 10⁻⁵ under the load. Tolerances — u: a fixed-mesh comparison at the conventional 32 × 32 eighth mesh, the mesh the solver's own in-code benchmark uses: the reference is the thin-shell value Belytschko et al. quote to four figures (1.8248 × 10⁻⁵), while the deflection under a point load has no mesh-converged limit in a Reissner–Mindlin (MITC4) shell, whose transverse shear force is unbounded at the load, so the value keeps rising with refinement (8 × 8, 16 × 16, 24 × 24, 32 × 32, 48 × 48 and 64 × 64 give 1.3559, 1.6942, 1.7735, 1.8038, 1.8275 and 1.8369 × 10⁻⁵, crossing the reference between 32 × 32 and 48 × 48 and staying above it); 2% is the margin the in-code benchmark gates 32 × 32 with, applied here to the same mesh (crates/solver/tests/benchmarks.rs, README)
- **[plastic-hinge-cantilever](../tests/oracle/plastic-hinge-cantilever/)** (theory): Plastic collapse of a cantilever: the fully plastic moment at the root. Source: Limit analysis (B. G. Neal, The Plastic Methods of Structural Analysis, 3rd ed., Chapman & Hall 1977, ch. 1–2): beam theory's plastic hinge at the root, the fully plastic moment M_p = σ_y b h²/4 of a rectangular section, collapses a cantilever of length L at P_c = M_p/L = 312.5 (b = h = 10, L = 200, σ_y = 250); a bound for the solid, whose collapse lies above it (W. Prager, P. G. Hodge, Theory of Perfectly Plastic Solids, Wiley 1951: a continuum mechanism allows no normal velocity jump, which the beam's hinge rotation is). Tolerances — collapse_force: the solid's collapse lies above beam theory's hinge: refined through the depth (4 to 8 elements) and along the length (40 to 160) the force settles 3.1 % above M_p/L (322.3), so the band is that bound's gap; the root is a symmetry plane (no rotation, free lateral contraction) held on average through a coupling, the tip pushed through another; reduced hex20, 20 × 2 × 4
- **[plastic-thick-cylinder](../tests/oracle/plastic-thick-cylinder/)** (theory): Elastic–perfectly plastic thick cylinder: plastic zone and collapse pressure. Source: Hill, The Mathematical Theory of Plasticity, Oxford 1950, ch. V §2: a von Mises cylinder in plane strain, elastically incompressible, with the plastic zone a ≤ r ≤ c under the pressure p = k (2 ln(c/a) + 1 − c²/b²), k = σ_y/√3, and the bore displacement u_a = k c²/(2 G a); collapse when c = b at p = 2k ln(b/a). Tolerances — u_bore: 20 reduced quad8 elements through the wall resolve the logarithmic plastic field and ν = 0.4999 stands in for Hill's incompressible elasticity (0.009 % apart); u_a ∝ c², so 0.2 % on u_a is 0.1 % on the plastic radius; collapse_force: once the wall is plastic through, perfect plasticity holds the force at the collapse value (σ_θ − σ_r = 2k everywhere, σ_z the mean of the others as plastic flow dominates); the band admits the quadrature of the logarithmic field
- **[pure-bending-coupling](../tests/oracle/pure-bending-coupling/)** (theory): Pure bending through a distributing coupling. Source: Euler–Bernoulli pure bending, σ = M_y z/I, θ = ML/(EI) (exact in elasticity for ν = 0); Timoshenko and Goodier, Theory of Elasticity, 3rd ed., 1970, §102. Tolerances — sigma_top: with ν = 0 pure bending is a quadratic displacement field that hex20 represents exactly; the coupling's nodal force pattern differs from the linear traction only within a depth or two of the end (Saint-Venant), five depths from the probe; rotation: the reference point follows the best-fit rigid motion of the end section, which the end zone's local deformation disturbs by well under 1%
- **[rotating-cylinder-axisymmetric](../tests/oracle/rotating-cylinder-axisymmetric/)** (theory): Long rotating solid cylinder, axisymmetric. Source: Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §32 (long rotating cylinder, ε_z = 0). Tolerances — radial_axis: stress extrapolated to the axis, where σ_r = σ_θ: under 1% with sixteen quadratic elements across; hoop_rim: stress extrapolated to the surface: under 1%
- **[rotating-disc-plane-stress](../tests/oracle/rotating-disc-plane-stress/)** (theory): Rotating disc with a central hole, plane stress. Source: Timoshenko and Goodier, Theory of Elasticity, 3rd ed., McGraw-Hill 1970, §32 (rotating disc of uniform thickness with a hole). Tolerances — hoop_bore: stress extrapolated to the bore surface, where the a²b²/r² term is steepest: 16 radial quadratic elements graded towards the bore leave about 0.2% (8 uniform: −2.4%; 32 graded: −0.05%); radial_max: the nearest node to √(ab) is within half an element of it, where σ_r is stationary (an error of order (h/r)², under 0.5%), and nodal averaging adds a few tenths of a percent; hoop_rim: as at the bore
- **[scordelis-lo-roof-shell](../tests/oracle/scordelis-lo-roof-shell/)** (benchmark): Scordelis–Lo roof with shell elements. Source: MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 8 (p. 8), Table 5(a) (p. 11); Belytschko, Stolarski, Liu, Carpenter and Ong, 'Stress projection for membrane and shear locking in shell finite elements', Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (the shell obstacle course). Tolerances — uz: MacNeal and Harder grade a thin-shell element within 2% of the theoretical value on a prescribed coarse mesh, the grading the sibling case scordelis-lo-roof-solid records (p. 14); this case uses 16 × 16, the mesh the solver's in-code gate test uses, and the flat MITC4 shell converges from below to the reference: 4 × 4, 8 × 8, 16 × 16, 32 × 32, 64 × 64 and 128 × 128 give 0.28459, 0.29401, 0.29901, 0.30060, 0.30118 and 0.30143, so 16 × 16 is 1.12% low and the mesh error shrinks monotonically inside the tolerance (README)
- **[scordelis-lo-roof-solid](../tests/oracle/scordelis-lo-roof-solid/)** (benchmark): Scordelis–Lo roof with one layer of hex20 reduced-integration solids. Source: MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20: Fig. 8 (p. 8) geometry, material and load; Table 5(a) (p. 11) reference displacement 0.3024; Belytschko et al., Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (shell obstacle course). Tolerances — uz: MacNeal and Harder grade an element A within 2% of the theoretical value on this prescribed coarse mesh (p. 14); MacNeal and Harder normalise by 0.3024 (the deep-shell value quoted in their [5] is 0.3086), and a solid model of R/t = 100 differs from shell theory by O(t/R)
- **[tie-heat-series](../tests/oracle/tie-heat-series/)** (theory): Heat through a tie: two blocks of conductivities 10 and 40 with non-matching meshes, 20 and 100 at the ends. Source: Series thermal resistances: steady one-dimensional conduction through two layers in perfect contact, T_i = (k1 T0 + k2 T1)/(k1 + k2) and q = ΔT/(L1/k1 + L2/k2) (F. P. Incropera, D. P. DeWitt, Fundamentals of Heat and Mass Transfer, §3.1, the composite wall). A linear field in each layer is the exact discrete solution, and the dual mortar tie reproduces a linear temperature across non-matching meshes. Tolerances — t_interface: exact discrete solution: linear in each block, and the tie holds the interface temperature for non-matching meshes; t_lower: exact discrete solution: linear in each block, and the tie holds the interface temperature for non-matching meshes; t_upper: exact discrete solution: linear in each block, and the tie holds the interface temperature for non-matching meshes; q_lower: the heat flow ΔT/(1/k1 + 1/k2) = 640 per unit area, −k ∂T/∂z uniform in each block; q_upper: the same heat flow crosses the tie: nothing is lost at the interface
- **[tie-patch](../tests/oracle/tie-patch/)** (theory): Tie patch test: two blocks with non-matching meshes tied together in uniaxial tension. Source: The patch test for mesh tying: a tie across non-matching meshes must transmit a constant stress exactly; B. I. Wohlmuth, A mortar finite element method using dual spaces for the Lagrange multiplier, SIAM J. Numer. Anal. 38(3):989–1012, 2000; M. A. Puso, A 3D mortar method for solid mechanics, IJNME 59:315–336, 2004. Uniaxial stress between frictionless symmetry planes is uniform in both blocks. Tolerances — szz_10: uniaxial stress E ε = 1000 × 0.01 is the exact discrete solution: the dual mortar conditions hold for the linear field on both meshes; szz_14: uniaxial stress E ε = 1000 × 0.01 is the exact discrete solution: the dual mortar conditions hold for the linear field on both meshes; szz_1: uniaxial stress E ε = 1000 × 0.01 is the exact discrete solution: the dual mortar conditions hold for the linear field on both meshes; szz_19: uniaxial stress E ε = 1000 × 0.01 is the exact discrete solution: the dual mortar conditions hold for the linear field on both meshes; szz_26: uniaxial stress E ε = 1000 × 0.01 is the exact discrete solution: the dual mortar conditions hold for the linear field on both meshes; sxx_14: the tie must not hold the lateral contraction of either mesh; uz_interface: the tied node follows the uniform strain field
@@ -378,10 +382,8 @@ Reference values already cited; each case gets its recipe when the capability it
| [cylinder-channel-2d1](../tests/oracle/cylinder-channel-2d1/) | benchmark | Flow around a cylinder, steady 2D-1 (Re = 20) | lattice Boltzmann CFD (M12) | drag coefficient (published interval 5.57–5.59) = 5.58; lift coefficient (interval 0.0104–0.0110) = 0.0107 | Schäfer and Turek, 'Benchmark computations of laminar flow around a cylinder', Notes on Numerical Fluid Mechanics 52 (1996) 547–566, Table 4 (reference intervals) |
| [explicit-hertz-spheres](../tests/oracle/explicit-hertz-spheres/) | theory | Two elastic spheres in a head-on collision: Hertz's force and contact duration (explicit contact) | a graded sphere mesh from commands (a cubed-sphere hex mesher, or tet refinement towards a point); until then the explicit crate's tests `spheres_collide_as_hertz_says` (a graded cubed-sphere quarter of each sphere, 27 648 hex8: peak force +2.3%, duration −0.4%) and its coarse twin in the main gate check this case on a mesh generated in code | the largest contact force, two steel spheres R = 10 mm (E = 210 GPa, ν = 0.3, ρ = 7.85 t/m³) meeting at 1 m/s (N) = 1005.4; the contact duration (s) = 6.0163e-5 | Hertz's quasi-static impact: with R* = R/2, m* = m/2, E* = E/(2(1 − ν²)), the approach reaches δ = (15 m* v²/(16 E* √R*))^(2/5), the force (4/3) E* √R* δ^(3/2), and the contact lasts 2.9432 δ/v; Hertz, J. reine angew. Math. 92:156–171, 1882; K. L. Johnson, Contact Mechanics, Cambridge 1985, §11.4 |
| [lid-driven-cavity-re100](../tests/oracle/lid-driven-cavity-re100/) | benchmark | Lid-driven cavity, Re = 100 | lattice Boltzmann CFD (M12) | u/U at y = 0.4531 on the vertical centreline = -0.2109 | Ghia, Ghia and Shin, Journal of Computational Physics 48 (1982) 387–411, Table I (u along the vertical centreline) |
| [mh-twisted-beam](../tests/oracle/mh-twisted-beam/) | benchmark | MacNeal–Harder twisted beam | shell elements (M8) or mapped blocks with helical edges | tip displacement along the in-plane load = 0.005424; tip displacement along the out-of-plane load = 0.001754 | MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 6 (p. 8), Table 3 (p. 10) |
| [mh-twisted-beam](../tests/oracle/mh-twisted-beam/) | benchmark | MacNeal–Harder twisted beam | a helical shell mesh: mesh.block's 2D form is planar and takes z = 0, so the twisted strip must be written node by node (as scordelis-lo-roof-shell and pinched-cylinder are), or mapped blocks must gain helical edges | tip displacement along the in-plane load = 0.005424; tip displacement along the out-of-plane load = 0.001754 | MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 6 (p. 8), Table 3 (p. 10) |
| [nafems-le11](../tests/oracle/nafems-le11/) | benchmark | NAFEMS LE11 solid cylinder/taper/sphere under a temperature field | thermal loads (M8 heat transfer) | σ_zz at A = -105 | NAFEMS, The Standard NAFEMS Benchmarks, TNSB Rev. 3, October 1990, test LE11 (target σ_zz = −105 MPa at A) |
| [nl-cook-membrane](../tests/oracle/nl-cook-membrane/) | benchmark | Cook's membrane, nearly incompressible neo-Hookean, large load (plane strain) | the published finite-strain reference value, transcribed from the paper with its load and material constants | vertical displacement of the top corner C (48, 60) = to be transcribed | R. D. Cook, Improved two-dimensional finite element, J. Struct. Div. ASCE 100(ST9):1851–1863, 1974 (the tapered panel (0, 0), (48, 44), (48, 60), (0, 44), clamped on x = 0, shear on x = 48); finite-strain versions with a neo-Hookean material are published by J. C. Simo, F. Armero, IJNME 33:1413–1449, 1992; the values to compare with are to be transcribed from the paper |
| [pinched-cylinder](../tests/oracle/pinched-cylinder/) | benchmark | Pinched cylinder with rigid diaphragms | shell elements (M8) | radial displacement under the load = -1.8248e-5 | Belytschko, Stolarski, Liu, Carpenter and Ong, 'Stress projection for membrane and shear locking in shell finite elements', Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (the shell obstacle course); reference 1.8248 × 10⁻⁵ under the load |
| [pinched-hemisphere](../tests/oracle/pinched-hemisphere/) | benchmark | Hemispherical shell with an 18° hole under alternating point loads | shell elements (M8), or mapped blocks that follow doubly curved faces | displacement under the load along the load = 0.094 | MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 9 (p. 9), Table 5(b) (p. 11): 0.0940 (lower bound 0.0924 from their [7]) |
| [scordelis-lo-roof-shell](../tests/oracle/scordelis-lo-roof-shell/) | benchmark | Scordelis–Lo roof with shell elements | shell elements (MITC4, M8) | vertical displacement at the midpoint of the free edge = -0.3024 | MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 8 (p. 8), Table 5(a) (p. 11); Belytschko, Stolarski, Liu, Carpenter and Ong, 'Stress projection for membrane and shear locking in shell finite elements', Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (the shell obstacle course) |
| [pinched-hemisphere](../tests/oracle/pinched-hemisphere/) | benchmark | Hemispherical shell with an 18° hole under alternating point loads | a doubly curved shell mesh: mesh.block's 2D form is planar and takes z = 0, so the quarter hemisphere with its 18° polar hole must be written node by node (as scordelis-lo-roof-shell and pinched-cylinder are), or a new patch command must mesh a doubly curved face | displacement under the load along the load = 0.094 | MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 9 (p. 9), Table 5(b) (p. 11): 0.0940 (lower bound 0.0924 from their [7]) |
| [taylor-bar](../tests/oracle/taylor-bar/) | experiment | Taylor bar impact (copper) | the measured final shapes, to be transcribed from the paper (explicit Johnson–Cook plasticity is in) | final over initial length = to be transcribed | Wilkins and Guinan, 'Impact of cylinders on a rigid boundary', Journal of Applied Physics 44 (1973) 1200–1206 (final length and mushroom diameter vs impact speed) |
+1 -1
View File
@@ -3,7 +3,7 @@
"kind": "benchmark",
"source": "MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 6 (p. 8), Table 3 (p. 10)",
"status": "pending",
"requires": "shell elements (M8) or mapped blocks with helical edges",
"requires": "a helical shell mesh: mesh.block's 2D form is planar and takes z = 0, so the twisted strip must be written node by node (as scordelis-lo-roof-shell and pinched-cylinder are), or mapped blocks must gain helical edges",
"quantities": [
{
"id": "in_plane",
+113 -1
View File
@@ -1,3 +1,115 @@
# Pinched cylinder with rigid diaphragms
Radius 300, length 600, thickness 3, E = 3 × 10⁶, ν = 0.3, rigid end diaphragms, two opposite unit loads at mid-length.
Our model of the published problem: a cylinder of radius 300, length 600 and thickness 3,
E = 3 × 10⁶, ν = 0.3, capped by rigid diaphragms (u_y = u_z = rot_x = 0 at the ends) and pinched by
two opposite unit forces at mid-length, one on each of two diametrically opposite generators.
Reference: 1.8248 × 10⁻⁵ radial displacement under the load (Belytschko, Stolarski, Liu, Carpenter
and Ong, *Stress projection for membrane and shear locking in shell finite elements*, CMAME 51
(1985) 221–258, the shell obstacle course) — the value the case already cited.
The eighth model: x from the loaded section (x = 0, symmetry in x) to the diaphragm (x = 300), φ
from the loaded generator (φ = 0, symmetry in y) to the side (φ = 90°, symmetry in z), with
R sin φ = y and R cos φ = z on the mid-surface R = 300. A quarter of the unit force, −0.25 in z,
acts on the single loaded node (0, 0, 300) — the model the solver's own pinched-cylinder benchmark
builds in code.
## The mesh
`mesh.block`'s 2D form takes its four corners at z = 0, so it cannot mesh a patch on a cylindrical
surface (it can be curved in its own plane, but it is planar): the recipe writes the 1089 nodes and
1024 quad4 elements one by one with `mesh.node.add` and `mesh.element.add`, the route
[docs/verification.md](../../../docs/verification.md) allows ("nodes and elements written one
by one"). Node 1 + i + 33 j lies at
(300 i/32, 300 sin(90° j/32), 300 cos(90° j/32)); element 1 + i + 32 j is
[node(i, j), node(i + 1, j), node(i + 1, j + 1), node(i, j + 1)], counter-clockwise seen from
outside, so its normal points away from the axis — the same mesh the solver's own pinched-cylinder
benchmark builds in code
([crates/solver/tests/benchmarks.rs](../../../crates/solver/tests/benchmarks.rs)).
The recipe was generated with the same script as `scordelis-lo-roof-shell`
(`python3 cylinder_recipe.py pinched-cylinder 32`):
```python
import json, math
def pinched_cylinder(n):
label = lambda i, j: 1 + i + (n + 1) * j
commands = []
for j in range(n + 1):
for i in range(n + 1):
x, phi = 300.0 * i / n, (math.pi / 2) * j / n
commands.append({"command": "mesh.node.add",
"params": {"label": label(i, j),
"xyz": [x, 300.0 * math.sin(phi), 300.0 * math.cos(phi)]}})
for j in range(n):
for i in range(n):
nodes = [label(i, j), label(i + 1, j), label(i + 1, j + 1), label(i, j + 1)]
commands.append({"command": "mesh.element.add",
"params": {"label": 1 + i + n * j, "kind": "quad4", "nodes": nodes}})
return commands + [
{"command": "model.set.create", "params": {"name": "shell", "elements": list(range(1, n * n + 1))}},
{"command": "model.set.create", "params": {"name": "diaphragm", "nodes": [label(n, j) for j in range(n + 1)]}},
{"command": "model.set.create", "params": {"name": "middle", "nodes": [label(0, j) for j in range(n + 1)]}},
{"command": "model.set.create", "params": {"name": "top", "nodes": [label(i, 0) for i in range(n + 1)]}},
{"command": "model.set.create", "params": {"name": "side", "nodes": [label(i, n) for i in range(n + 1)]}},
{"command": "model.set.create", "params": {"name": "pinch", "nodes": [label(0, 0)]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 3e6, "poisson": 0.3}}},
{"command": "model.section.create", "params": {"name": "shell", "set": "shell", "material": "Mat", "kind": {"type": "shell", "thickness": 3.0}}},
{"command": "model.boundary_condition.create", "params": {"name": "diaphragm", "type": "displacement", "target": {"set": "diaphragm"}, "values": [None, 0, 0, 0, None, None]}},
{"command": "model.boundary_condition.create", "params": {"name": "middle", "type": "symmetry", "target": {"set": "middle"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "top", "type": "symmetry", "target": {"set": "top"}, "plane": "y"}},
{"command": "model.boundary_condition.create", "params": {"name": "side", "type": "symmetry", "target": {"set": "side"}, "plane": "z"}},
{"command": "model.load.create", "params": {"name": "pinch", "type": "force", "target": {"set": "pinch"}, "vector": [0, 0, -0.25]}},
{"command": "model.step.create", "params": {"name": "Load", "procedure": {"type": "static"}, "boundary_conditions": ["diaphragm", "middle", "top", "side"], "loads": ["pinch"]}},
{"command": "solve.static", "params": {}, "id": "solve"},
]
print("[\n " + ",\n ".join(json.dumps(c) for c in pinched_cylinder(32)) + "\n]")
```
## A fixed-mesh benchmark, not a convergence study
The quantity is the deflection *under a point load*, and there a Reissner–Mindlin (MITC4) shell
carries an unbounded transverse shear force: the deflection under the load keeps growing with
refinement instead of converging. The published 1.8248 × 10⁻⁵ is a thin-shell value, and this case
compares against it on the conventional 32 × 32 eighth mesh — the mesh the solver's own
pinched-cylinder benchmark uses — not as a limit. The table shows what refinement actually does
(each row is the listing above with the `32` in its last line replaced by the row's divisions and
run through `cargo xtask oracle` as a scratch case):
| cells | u | vs reference |
|---|---|---|
| 8 × 8 | −1.3559 × 10⁻⁵ | −25.7% |
| 16 × 16 | −1.6942 × 10⁻⁵ | −7.2% |
| 24 × 24 | −1.7735 × 10⁻⁵ | −2.8% |
| 32 × 32 (this case) | −1.803845342860719 × 10⁻⁵ | −1.15% |
| 48 × 48 | −1.8275 × 10⁻⁵ | +0.15% |
| 64 × 64 | −1.8369 × 10⁻⁵ | +0.66% |
The sequence rises through the reference between 32 × 32 and 48 × 48 and keeps rising at the two
finer meshes, which is what a shear-deformable shell under a point load must do.
The solver's in-code benchmark of the same problem shows the same ascent on its 8 × 8, 16 × 16 and
32 × 32 eighth meshes (it gates 32 × 32 within 2%), so the command route and the in-code route
agree on the fixed-mesh comparison.
## Tolerance
2% covers the agreement with the thin-shell reference at the 32 × 32 eighth mesh (1.15% low), the
conventional mesh of the shell obstacle course and the one the solver's own pinched-cylinder
benchmark gates at 2%, so the command route and the in-code route are compared on equal terms. The
reference itself is quoted by Belytschko et al. to four figures (1.8248 × 10⁻⁵). Because the point
load makes the deflection mesh-dependent rather than convergent (above), this is a fixed-mesh
tolerance and not a convergence statement: the two finer meshes sit 0.15% and 0.66% above the
reference and stay inside it. The mesh is not marked `slow`: the case solves in about 0.15 s.
`fixture.json` is the accepted value at 32 × 32 (−1.803845342860719 × 10⁻⁵) with the runner's
default band: the mesh is written by the recipe, not generated from geometry, so it is bit-identical
on every platform and the result is frozen.
## Running it
```sh
cargo xtask oracle --case pinched-cylinder
cargo xtask oracle --bless pinched-cylinder # only after the case passes
```
+20 -4
View File
@@ -2,13 +2,29 @@
"title": "Pinched cylinder with rigid diaphragms",
"kind": "benchmark",
"source": "Belytschko, Stolarski, Liu, Carpenter and Ong, 'Stress projection for membrane and shear locking in shell finite elements', Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (the shell obstacle course); reference 1.8248 × 10⁻⁵ under the load",
"status": "pending",
"requires": "shell elements (M8)",
"quantities": [
{
"id": "u",
"quantity": "radial displacement under the load",
"value": -1.8248e-05
"quantity": "radial displacement under the load, mid-surface",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0,
0,
300
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": -1.8248e-05,
"tolerance": {
"relative": 0.02
},
"reason": "a fixed-mesh comparison at the conventional 32 × 32 eighth mesh, the mesh the solver's own in-code benchmark uses: the reference is the thin-shell value Belytschko et al. quote to four figures (1.8248 × 10⁻⁵), while the deflection under a point load has no mesh-converged limit in a Reissner–Mindlin (MITC4) shell, whose transverse shear force is unbounded at the load, so the value keeps rising with refinement (8 × 8, 16 × 16, 24 × 24, 32 × 32, 48 × 48 and 64 × 64 give 1.3559, 1.6942, 1.7735, 1.8038, 1.8275 and 1.8369 × 10⁻⁵, crossing the reference between 32 × 32 and 48 × 48 and staying above it); 2% is the margin the in-code benchmark gates 32 × 32 with, applied here to the same mesh (crates/solver/tests/benchmarks.rs, README)"
}
]
}
@@ -0,0 +1,9 @@
{
"note": "FieldCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"u": {
"band": 1.8247999999999998e-14,
"value": -0.00001803845342860719
}
}
}
File diff suppressed because it is too large. Load diff
@@ -3,7 +3,7 @@
"kind": "benchmark",
"source": "MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 9 (p. 9), Table 5(b) (p. 11): 0.0940 (lower bound 0.0924 from their [7])",
"status": "pending",
"requires": "shell elements (M8), or mapped blocks that follow doubly curved faces",
"requires": "a doubly curved shell mesh: mesh.block's 2D form is planar and takes z = 0, so the quarter hemisphere with its 18° polar hole must be written node by node (as scordelis-lo-roof-shell and pinched-cylinder are), or a new patch command must mesh a doubly curved face",
"quantities": [
{
"id": "u",
+103 -1
View File
@@ -1,3 +1,105 @@
# Scordelis–Lo roof with shell elements
The roof of `scordelis-lo-roof-solid` meshed with shells.
Our model of the published problem: a cylindrical roof of radius 25, length 50 and thickness 0.25,
spanning ±40°, E = 4.32 × 10⁸, ν = 0, carrying its own weight (90 per area, a body force 90/t = 360
per volume), supported by rigid diaphragms at its curved ends and free along its straight edges.
This is `scordelis-lo-roof-solid` with flat quad4 (MITC4) shells in place of the hex20 layer, so the
same reference is checked by two element routes; the reference value, 0.3024 for the vertical
deflection at the middle of a free edge, is the one the case already cited (MacNeal and Harder,
*A proposed standard set of problems to test finite element accuracy*, FEAD 1 (1985) 3–20, Fig. 8,
Table 5(a); Belytschko et al., CMAME 51 (1985) 221–258).
The quarter model: x from the mid-span (x = 0, symmetry in x) to the diaphragm (x = 25,
u_y = u_z = rot_x = 0), φ from the crown (φ = 0, symmetry in y) to the free edge at 40°, with
R sin φ = y and R cos φ = z on the mid-surface R = 25. The measured node is the free-edge mid-span
node (0, 16.0697, 19.1511), the node the solid case measures too.
## The mesh
`mesh.block`'s 2D form takes its four corners at z = 0, so it cannot mesh a patch on a cylindrical
surface (it can be curved in its own plane, but it is planar): the recipe writes the 289 nodes and
256 quad4 elements one by one with `mesh.node.add` and `mesh.element.add`, the route
[docs/verification.md](../../../docs/verification.md) allows ("nodes and elements written one
by one"). Node 1 + i + 17 j lies at
(25 i/16, 25 sin(40° j/16), 25 cos(40° j/16)); element 1 + i + 16 j is
[node(i, j), node(i + 1, j), node(i + 1, j + 1), node(i, j + 1)], counter-clockwise seen from
outside, so its normal points away from the axis — the same mesh the solver's own Scordelis–Lo
benchmark builds in code
([crates/solver/tests/benchmarks.rs](../../../crates/solver/tests/benchmarks.rs)), so the command
route and the in-code route are comparable.
The recipe was generated with this script (`python3 cylinder_recipe.py scordelis-lo 16`):
```python
import json, math
def scordelis_lo(n):
label = lambda i, j: 1 + i + (n + 1) * j
commands = []
for j in range(n + 1):
for i in range(n + 1):
x, phi = 25.0 * i / n, math.radians(40.0) * j / n
commands.append({"command": "mesh.node.add",
"params": {"label": label(i, j),
"xyz": [x, 25.0 * math.sin(phi), 25.0 * math.cos(phi)]}})
for j in range(n):
for i in range(n):
nodes = [label(i, j), label(i + 1, j), label(i + 1, j + 1), label(i, j + 1)]
commands.append({"command": "mesh.element.add",
"params": {"label": 1 + i + n * j, "kind": "quad4", "nodes": nodes}})
return commands + [
{"command": "model.set.create", "params": {"name": "shell", "elements": list(range(1, n * n + 1))}},
{"command": "model.set.create", "params": {"name": "diaphragm", "nodes": [label(n, j) for j in range(n + 1)]}},
{"command": "model.set.create", "params": {"name": "midspan", "nodes": [label(0, j) for j in range(n + 1)]}},
{"command": "model.set.create", "params": {"name": "crown", "nodes": [label(i, 0) for i in range(n + 1)]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 4.32e8, "poisson": 0.0}}},
{"command": "model.section.create", "params": {"name": "shell", "set": "shell", "material": "Mat", "kind": {"type": "shell", "thickness": 0.25}}},
{"command": "model.boundary_condition.create", "params": {"name": "diaphragm", "type": "displacement", "target": {"set": "diaphragm"}, "values": [None, 0, 0, 0, None, None]}},
{"command": "model.boundary_condition.create", "params": {"name": "midspan", "type": "symmetry", "target": {"set": "midspan"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "crown", "type": "symmetry", "target": {"set": "crown"}, "plane": "y"}},
{"command": "model.load.create", "params": {"name": "weight", "type": "body_force", "set": "shell", "vector": [0, 0, -360.0]}},
{"command": "model.step.create", "params": {"name": "Load", "procedure": {"type": "static"}, "boundary_conditions": ["diaphragm", "midspan", "crown"], "loads": ["weight"]}},
{"command": "solve.static", "params": {}, "id": "solve"},
]
print("[\n " + ",\n ".join(json.dumps(c) for c in scordelis_lo(16)) + "\n]")
```
## Refinement
The flat MITC4 shell approaches the reference from below and keeps closing the gap, so the mesh
error is inside the tolerance and shrinking. Every row is the listing above with the `16` in its
last line replaced by the row's divisions and run through `cargo xtask oracle` as a scratch case;
the case mesh is 16 × 16:
| cells | u_z | error |
|---|---|---|
| 4 × 4 | −0.28459 | −5.89% |
| 8 × 8 | −0.29401 | −2.77% |
| 16 × 16 (this case) | −0.29901009815961804 | −1.12% |
| 32 × 32 | −0.30060 | −0.60% |
| 64 × 64 | −0.30118 | −0.40% |
| 128 × 128 | −0.30143 | −0.32% |
The solid case of the same roof reports −0.3014 on its 16 × 16 × 1 hex20 mesh, i.e. 0.33% low: two
element formulations, two meshes, one reference.
## Tolerance
2%, the grading the sibling solid case already records for this problem from MacNeal and Harder (an
element is graded within 2% of the theoretical value on a prescribed coarse mesh, and their
normalised target is 0.3024). 16 × 16 is our choice of mesh — the one the solver's in-code gate test
uses — and it is 1.12% low; its own next refinement (32 × 32) moves the value by 0.53% of the
reference, a quarter of the tolerance, on a mesh error that falls monotonically. The tolerance is
the source's grading, not a cover for the discretisation error.
`fixture.json` is the accepted value at 16 × 16 (−0.29901009815961804) with the runner's default
band: the mesh is written by the recipe, not generated from geometry, so it is bit-identical on
every platform and the result is frozen.
## Running it
```sh
cargo xtask oracle --case scordelis-lo-roof-shell
cargo xtask oracle --bless scordelis-lo-roof-shell # only after the case passes
```
@@ -2,13 +2,29 @@
"title": "Scordelis–Lo roof with shell elements",
"kind": "benchmark",
"source": "MacNeal and Harder, 'A proposed standard set of problems to test finite element accuracy', Finite Elements in Analysis and Design 1 (1985) 3–20, Fig. 8 (p. 8), Table 5(a) (p. 11); Belytschko, Stolarski, Liu, Carpenter and Ong, 'Stress projection for membrane and shear locking in shell finite elements', Computer Methods in Applied Mechanics and Engineering 51 (1985) 221–258 (the shell obstacle course)",
"status": "pending",
"requires": "shell elements (MITC4, M8)",
"quantities": [
{
"id": "uz",
"quantity": "vertical displacement at the midpoint of the free edge",
"value": -0.3024
"quantity": "vertical displacement at the midpoint of the free edge, mid-surface",
"measure": {
"command": "solve.probe",
"params": {
"step": "Load",
"at": [
[
0,
16.069690242163,
19.151111077974
]
]
},
"pointer": "/nodes/0/displacement/2"
},
"value": -0.3024,
"tolerance": {
"relative": 0.02
},
"reason": "MacNeal and Harder grade a thin-shell element within 2% of the theoretical value on a prescribed coarse mesh, the grading the sibling case scordelis-lo-roof-solid records (p. 14); this case uses 16 × 16, the mesh the solver's in-code gate test uses, and the flat MITC4 shell converges from below to the reference: 4 × 4, 8 × 8, 16 × 16, 32 × 32, 64 × 64 and 128 × 128 give 0.28459, 0.29401, 0.29901, 0.30060, 0.30118 and 0.30143, so 16 × 16 is 1.12% low and the mesh error shrinks monotonically inside the tolerance (README)"
}
]
}
@@ -0,0 +1,9 @@
{
"note": "FieldCraft's accepted results for this case, written by `cargo xtask oracle --bless`. A result outside its band fails CI.",
"values": {
"uz": {
"band": 3.024e-10,
"value": -0.29901009815961804
}
}
}
@@ -0,0 +1,559 @@
[
{"command": "mesh.node.add", "params": {"label": 1, "xyz": [0.0, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 2, "xyz": [1.5625, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 3, "xyz": [3.125, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 4, "xyz": [4.6875, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 5, "xyz": [6.25, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 6, "xyz": [7.8125, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 7, "xyz": [9.375, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 8, "xyz": [10.9375, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 9, "xyz": [12.5, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 10, "xyz": [14.0625, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 11, "xyz": [15.625, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 12, "xyz": [17.1875, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 13, "xyz": [18.75, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 14, "xyz": [20.3125, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 15, "xyz": [21.875, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 16, "xyz": [23.4375, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 17, "xyz": [25.0, 0.0, 25.0]}},
{"command": "mesh.node.add", "params": {"label": 18, "xyz": [0.0, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 19, "xyz": [1.5625, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 20, "xyz": [3.125, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 21, "xyz": [4.6875, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 22, "xyz": [6.25, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 23, "xyz": [7.8125, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 24, "xyz": [9.375, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 25, "xyz": [10.9375, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 26, "xyz": [12.5, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 27, "xyz": [14.0625, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 28, "xyz": [15.625, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 29, "xyz": [17.1875, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 30, "xyz": [18.75, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 31, "xyz": [20.3125, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 32, "xyz": [21.875, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 33, "xyz": [23.4375, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 34, "xyz": [25.0, 1.0904846841334, 24.976205539546445]}},
{"command": "mesh.node.add", "params": {"label": 35, "xyz": [0.0, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 36, "xyz": [1.5625, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 37, "xyz": [3.125, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 38, "xyz": [4.6875, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 39, "xyz": [6.25, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 40, "xyz": [7.8125, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 41, "xyz": [9.375, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 42, "xyz": [10.9375, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 43, "xyz": [12.5, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 44, "xyz": [14.0625, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 45, "xyz": [15.625, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 46, "xyz": [17.1875, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 47, "xyz": [18.75, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 48, "xyz": [20.3125, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 49, "xyz": [21.875, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 50, "xyz": [23.4375, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 51, "xyz": [25.0, 2.1788935686914543, 24.90486745229364]}},
{"command": "mesh.node.add", "params": {"label": 52, "xyz": [0.0, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 53, "xyz": [1.5625, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 54, "xyz": [3.125, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 55, "xyz": [4.6875, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 56, "xyz": [6.25, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 57, "xyz": [7.8125, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 58, "xyz": [9.375, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 59, "xyz": [10.9375, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 60, "xyz": [12.5, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 61, "xyz": [14.0625, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 62, "xyz": [15.625, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 63, "xyz": [17.1875, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 64, "xyz": [18.75, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 65, "xyz": [20.3125, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 66, "xyz": [21.875, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 67, "xyz": [23.4375, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 68, "xyz": [25.0, 3.2631548055012893, 24.78612153434526]}},
{"command": "mesh.node.add", "params": {"label": 69, "xyz": [0.0, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 70, "xyz": [1.5625, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 71, "xyz": [3.125, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 72, "xyz": [4.6875, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 73, "xyz": [6.25, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 74, "xyz": [7.8125, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 75, "xyz": [9.375, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 76, "xyz": [10.9375, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 77, "xyz": [12.5, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 78, "xyz": [14.0625, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 79, "xyz": [15.625, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 80, "xyz": [17.1875, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 81, "xyz": [18.75, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 82, "xyz": [20.3125, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 83, "xyz": [21.875, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 84, "xyz": [23.4375, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 85, "xyz": [25.0, 4.341204441673258, 24.6201938253052]}},
{"command": "mesh.node.add", "params": {"label": 86, "xyz": [0.0, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 87, "xyz": [1.5625, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 88, "xyz": [3.125, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 89, "xyz": [4.6875, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 90, "xyz": [6.25, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 91, "xyz": [7.8125, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 92, "xyz": [9.375, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 93, "xyz": [10.9375, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 94, "xyz": [12.5, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 95, "xyz": [14.0625, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 96, "xyz": [15.625, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 97, "xyz": [17.1875, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 98, "xyz": [18.75, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 99, "xyz": [20.3125, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 100, "xyz": [21.875, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 101, "xyz": [23.4375, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 102, "xyz": [25.0, 5.410990348452572, 24.407400177998333]}},
{"command": "mesh.node.add", "params": {"label": 103, "xyz": [0.0, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 104, "xyz": [1.5625, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 105, "xyz": [3.125, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 106, "xyz": [4.6875, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 107, "xyz": [6.25, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 108, "xyz": [7.8125, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 109, "xyz": [9.375, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 110, "xyz": [10.9375, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 111, "xyz": [12.5, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 112, "xyz": [14.0625, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 113, "xyz": [15.625, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 114, "xyz": [17.1875, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 115, "xyz": [18.75, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 116, "xyz": [20.3125, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 117, "xyz": [21.875, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 118, "xyz": [23.4375, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 119, "xyz": [25.0, 6.4704761275630185, 24.148145657226706]}},
{"command": "mesh.node.add", "params": {"label": 120, "xyz": [0.0, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 121, "xyz": [1.5625, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 122, "xyz": [3.125, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 123, "xyz": [4.6875, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 124, "xyz": [6.25, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 125, "xyz": [7.8125, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 126, "xyz": [9.375, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 127, "xyz": [10.9375, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 128, "xyz": [12.5, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 129, "xyz": [14.0625, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 130, "xyz": [15.625, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 131, "xyz": [17.1875, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 132, "xyz": [18.75, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 133, "xyz": [20.3125, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 134, "xyz": [21.875, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 135, "xyz": [23.4375, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 136, "xyz": [25.0, 7.517644987606828, 23.842923768705674]}},
{"command": "mesh.node.add", "params": {"label": 137, "xyz": [0.0, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 138, "xyz": [1.5625, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 139, "xyz": [3.125, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 140, "xyz": [4.6875, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 141, "xyz": [6.25, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 142, "xyz": [7.8125, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 143, "xyz": [9.375, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 144, "xyz": [10.9375, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 145, "xyz": [12.5, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 146, "xyz": [14.0625, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 147, "xyz": [15.625, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 148, "xyz": [17.1875, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 149, "xyz": [18.75, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 150, "xyz": [20.3125, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 151, "xyz": [21.875, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 152, "xyz": [23.4375, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 153, "xyz": [25.0, 8.550503583141717, 23.49231551964771]}},
{"command": "mesh.node.add", "params": {"label": 154, "xyz": [0.0, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 155, "xyz": [1.5625, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 156, "xyz": [3.125, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 157, "xyz": [4.6875, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 158, "xyz": [6.25, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 159, "xyz": [7.8125, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 160, "xyz": [9.375, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 161, "xyz": [10.9375, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 162, "xyz": [12.5, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 163, "xyz": [14.0625, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 164, "xyz": [15.625, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 165, "xyz": [17.1875, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 166, "xyz": [18.75, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 167, "xyz": [20.3125, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 168, "xyz": [21.875, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 169, "xyz": [23.4375, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 170, "xyz": [25.0, 9.567085809127244, 23.09698831278217]}},
{"command": "mesh.node.add", "params": {"label": 171, "xyz": [0.0, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 172, "xyz": [1.5625, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 173, "xyz": [3.125, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 174, "xyz": [4.6875, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 175, "xyz": [6.25, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 176, "xyz": [7.8125, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 177, "xyz": [9.375, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 178, "xyz": [10.9375, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 179, "xyz": [12.5, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 180, "xyz": [14.0625, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 181, "xyz": [15.625, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 182, "xyz": [17.1875, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 183, "xyz": [18.75, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 184, "xyz": [20.3125, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 185, "xyz": [21.875, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 186, "xyz": [23.4375, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 187, "xyz": [25.0, 10.565456543517486, 22.657694675916247]}},
{"command": "mesh.node.add", "params": {"label": 188, "xyz": [0.0, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 189, "xyz": [1.5625, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 190, "xyz": [3.125, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 191, "xyz": [4.6875, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 192, "xyz": [6.25, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 193, "xyz": [7.8125, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 194, "xyz": [9.375, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 195, "xyz": [10.9375, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 196, "xyz": [12.5, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 197, "xyz": [14.0625, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 198, "xyz": [15.625, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 199, "xyz": [17.1875, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 200, "xyz": [18.75, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 201, "xyz": [20.3125, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 202, "xyz": [21.875, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 203, "xyz": [23.4375, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 204, "xyz": [25.0, 11.543715330875848, 22.175270829455542]}},
{"command": "mesh.node.add", "params": {"label": 205, "xyz": [0.0, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 206, "xyz": [1.5625, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 207, "xyz": [3.125, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 208, "xyz": [4.6875, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 209, "xyz": [6.25, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 210, "xyz": [7.8125, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 211, "xyz": [9.375, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 212, "xyz": [10.9375, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 213, "xyz": [12.5, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 214, "xyz": [14.0625, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 215, "xyz": [15.625, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 216, "xyz": [17.1875, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 217, "xyz": [18.75, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 218, "xyz": [20.3125, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 219, "xyz": [21.875, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 220, "xyz": [23.4375, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 221, "xyz": [25.0, 12.499999999999998, 21.65063509461097]}},
{"command": "mesh.node.add", "params": {"label": 222, "xyz": [0.0, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 223, "xyz": [1.5625, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 224, "xyz": [3.125, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 225, "xyz": [4.6875, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 226, "xyz": [6.25, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 227, "xyz": [7.8125, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 228, "xyz": [9.375, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 229, "xyz": [10.9375, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 230, "xyz": [12.5, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 231, "xyz": [14.0625, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 232, "xyz": [15.625, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 233, "xyz": [17.1875, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 234, "xyz": [18.75, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 235, "xyz": [20.3125, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 236, "xyz": [21.875, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 237, "xyz": [23.4375, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 238, "xyz": [25.0, 13.432490208670597, 21.08478614532214]}},
{"command": "mesh.node.add", "params": {"label": 239, "xyz": [0.0, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 240, "xyz": [1.5625, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 241, "xyz": [3.125, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 242, "xyz": [4.6875, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 243, "xyz": [6.25, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 244, "xyz": [7.8125, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 245, "xyz": [9.375, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 246, "xyz": [10.9375, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 247, "xyz": [12.5, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 248, "xyz": [14.0625, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 249, "xyz": [15.625, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 250, "xyz": [17.1875, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 251, "xyz": [18.75, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 252, "xyz": [20.3125, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 253, "xyz": [21.875, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 254, "xyz": [23.4375, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 255, "xyz": [25.0, 14.339410908776152, 20.478801107224793]}},
{"command": "mesh.node.add", "params": {"label": 256, "xyz": [0.0, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 257, "xyz": [1.5625, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 258, "xyz": [3.125, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 259, "xyz": [4.6875, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 260, "xyz": [6.25, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 261, "xyz": [7.8125, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 262, "xyz": [9.375, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 263, "xyz": [10.9375, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 264, "xyz": [12.5, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 265, "xyz": [14.0625, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 266, "xyz": [15.625, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 267, "xyz": [17.1875, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 268, "xyz": [18.75, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 269, "xyz": [20.3125, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 270, "xyz": [21.875, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 271, "xyz": [23.4375, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 272, "xyz": [25.0, 15.219035725218017, 19.83383350728088]}},
{"command": "mesh.node.add", "params": {"label": 273, "xyz": [0.0, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 274, "xyz": [1.5625, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 275, "xyz": [3.125, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 276, "xyz": [4.6875, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 277, "xyz": [6.25, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 278, "xyz": [7.8125, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 279, "xyz": [9.375, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 280, "xyz": [10.9375, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 281, "xyz": [12.5, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 282, "xyz": [14.0625, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 283, "xyz": [15.625, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 284, "xyz": [17.1875, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 285, "xyz": [18.75, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 286, "xyz": [20.3125, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 287, "xyz": [21.875, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 288, "xyz": [23.4375, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.node.add", "params": {"label": 289, "xyz": [25.0, 16.06969024216348, 19.151111077974452]}},
{"command": "mesh.element.add", "params": {"label": 1, "kind": "quad4", "nodes": [1, 2, 19, 18]}},
{"command": "mesh.element.add", "params": {"label": 2, "kind": "quad4", "nodes": [2, 3, 20, 19]}},
{"command": "mesh.element.add", "params": {"label": 3, "kind": "quad4", "nodes": [3, 4, 21, 20]}},
{"command": "mesh.element.add", "params": {"label": 4, "kind": "quad4", "nodes": [4, 5, 22, 21]}},
{"command": "mesh.element.add", "params": {"label": 5, "kind": "quad4", "nodes": [5, 6, 23, 22]}},
{"command": "mesh.element.add", "params": {"label": 6, "kind": "quad4", "nodes": [6, 7, 24, 23]}},
{"command": "mesh.element.add", "params": {"label": 7, "kind": "quad4", "nodes": [7, 8, 25, 24]}},
{"command": "mesh.element.add", "params": {"label": 8, "kind": "quad4", "nodes": [8, 9, 26, 25]}},
{"command": "mesh.element.add", "params": {"label": 9, "kind": "quad4", "nodes": [9, 10, 27, 26]}},
{"command": "mesh.element.add", "params": {"label": 10, "kind": "quad4", "nodes": [10, 11, 28, 27]}},
{"command": "mesh.element.add", "params": {"label": 11, "kind": "quad4", "nodes": [11, 12, 29, 28]}},
{"command": "mesh.element.add", "params": {"label": 12, "kind": "quad4", "nodes": [12, 13, 30, 29]}},
{"command": "mesh.element.add", "params": {"label": 13, "kind": "quad4", "nodes": [13, 14, 31, 30]}},
{"command": "mesh.element.add", "params": {"label": 14, "kind": "quad4", "nodes": [14, 15, 32, 31]}},
{"command": "mesh.element.add", "params": {"label": 15, "kind": "quad4", "nodes": [15, 16, 33, 32]}},
{"command": "mesh.element.add", "params": {"label": 16, "kind": "quad4", "nodes": [16, 17, 34, 33]}},
{"command": "mesh.element.add", "params": {"label": 17, "kind": "quad4", "nodes": [18, 19, 36, 35]}},
{"command": "mesh.element.add", "params": {"label": 18, "kind": "quad4", "nodes": [19, 20, 37, 36]}},
{"command": "mesh.element.add", "params": {"label": 19, "kind": "quad4", "nodes": [20, 21, 38, 37]}},
{"command": "mesh.element.add", "params": {"label": 20, "kind": "quad4", "nodes": [21, 22, 39, 38]}},
{"command": "mesh.element.add", "params": {"label": 21, "kind": "quad4", "nodes": [22, 23, 40, 39]}},
{"command": "mesh.element.add", "params": {"label": 22, "kind": "quad4", "nodes": [23, 24, 41, 40]}},
{"command": "mesh.element.add", "params": {"label": 23, "kind": "quad4", "nodes": [24, 25, 42, 41]}},
{"command": "mesh.element.add", "params": {"label": 24, "kind": "quad4", "nodes": [25, 26, 43, 42]}},
{"command": "mesh.element.add", "params": {"label": 25, "kind": "quad4", "nodes": [26, 27, 44, 43]}},
{"command": "mesh.element.add", "params": {"label": 26, "kind": "quad4", "nodes": [27, 28, 45, 44]}},
{"command": "mesh.element.add", "params": {"label": 27, "kind": "quad4", "nodes": [28, 29, 46, 45]}},
{"command": "mesh.element.add", "params": {"label": 28, "kind": "quad4", "nodes": [29, 30, 47, 46]}},
{"command": "mesh.element.add", "params": {"label": 29, "kind": "quad4", "nodes": [30, 31, 48, 47]}},
{"command": "mesh.element.add", "params": {"label": 30, "kind": "quad4", "nodes": [31, 32, 49, 48]}},
{"command": "mesh.element.add", "params": {"label": 31, "kind": "quad4", "nodes": [32, 33, 50, 49]}},
{"command": "mesh.element.add", "params": {"label": 32, "kind": "quad4", "nodes": [33, 34, 51, 50]}},
{"command": "mesh.element.add", "params": {"label": 33, "kind": "quad4", "nodes": [35, 36, 53, 52]}},
{"command": "mesh.element.add", "params": {"label": 34, "kind": "quad4", "nodes": [36, 37, 54, 53]}},
{"command": "mesh.element.add", "params": {"label": 35, "kind": "quad4", "nodes": [37, 38, 55, 54]}},
{"command": "mesh.element.add", "params": {"label": 36, "kind": "quad4", "nodes": [38, 39, 56, 55]}},
{"command": "mesh.element.add", "params": {"label": 37, "kind": "quad4", "nodes": [39, 40, 57, 56]}},
{"command": "mesh.element.add", "params": {"label": 38, "kind": "quad4", "nodes": [40, 41, 58, 57]}},
{"command": "mesh.element.add", "params": {"label": 39, "kind": "quad4", "nodes": [41, 42, 59, 58]}},
{"command": "mesh.element.add", "params": {"label": 40, "kind": "quad4", "nodes": [42, 43, 60, 59]}},
{"command": "mesh.element.add", "params": {"label": 41, "kind": "quad4", "nodes": [43, 44, 61, 60]}},
{"command": "mesh.element.add", "params": {"label": 42, "kind": "quad4", "nodes": [44, 45, 62, 61]}},
{"command": "mesh.element.add", "params": {"label": 43, "kind": "quad4", "nodes": [45, 46, 63, 62]}},
{"command": "mesh.element.add", "params": {"label": 44, "kind": "quad4", "nodes": [46, 47, 64, 63]}},
{"command": "mesh.element.add", "params": {"label": 45, "kind": "quad4", "nodes": [47, 48, 65, 64]}},
{"command": "mesh.element.add", "params": {"label": 46, "kind": "quad4", "nodes": [48, 49, 66, 65]}},
{"command": "mesh.element.add", "params": {"label": 47, "kind": "quad4", "nodes": [49, 50, 67, 66]}},
{"command": "mesh.element.add", "params": {"label": 48, "kind": "quad4", "nodes": [50, 51, 68, 67]}},
{"command": "mesh.element.add", "params": {"label": 49, "kind": "quad4", "nodes": [52, 53, 70, 69]}},
{"command": "mesh.element.add", "params": {"label": 50, "kind": "quad4", "nodes": [53, 54, 71, 70]}},
{"command": "mesh.element.add", "params": {"label": 51, "kind": "quad4", "nodes": [54, 55, 72, 71]}},
{"command": "mesh.element.add", "params": {"label": 52, "kind": "quad4", "nodes": [55, 56, 73, 72]}},
{"command": "mesh.element.add", "params": {"label": 53, "kind": "quad4", "nodes": [56, 57, 74, 73]}},
{"command": "mesh.element.add", "params": {"label": 54, "kind": "quad4", "nodes": [57, 58, 75, 74]}},
{"command": "mesh.element.add", "params": {"label": 55, "kind": "quad4", "nodes": [58, 59, 76, 75]}},
{"command": "mesh.element.add", "params": {"label": 56, "kind": "quad4", "nodes": [59, 60, 77, 76]}},
{"command": "mesh.element.add", "params": {"label": 57, "kind": "quad4", "nodes": [60, 61, 78, 77]}},
{"command": "mesh.element.add", "params": {"label": 58, "kind": "quad4", "nodes": [61, 62, 79, 78]}},
{"command": "mesh.element.add", "params": {"label": 59, "kind": "quad4", "nodes": [62, 63, 80, 79]}},
{"command": "mesh.element.add", "params": {"label": 60, "kind": "quad4", "nodes": [63, 64, 81, 80]}},
{"command": "mesh.element.add", "params": {"label": 61, "kind": "quad4", "nodes": [64, 65, 82, 81]}},
{"command": "mesh.element.add", "params": {"label": 62, "kind": "quad4", "nodes": [65, 66, 83, 82]}},
{"command": "mesh.element.add", "params": {"label": 63, "kind": "quad4", "nodes": [66, 67, 84, 83]}},
{"command": "mesh.element.add", "params": {"label": 64, "kind": "quad4", "nodes": [67, 68, 85, 84]}},
{"command": "mesh.element.add", "params": {"label": 65, "kind": "quad4", "nodes": [69, 70, 87, 86]}},
{"command": "mesh.element.add", "params": {"label": 66, "kind": "quad4", "nodes": [70, 71, 88, 87]}},
{"command": "mesh.element.add", "params": {"label": 67, "kind": "quad4", "nodes": [71, 72, 89, 88]}},
{"command": "mesh.element.add", "params": {"label": 68, "kind": "quad4", "nodes": [72, 73, 90, 89]}},
{"command": "mesh.element.add", "params": {"label": 69, "kind": "quad4", "nodes": [73, 74, 91, 90]}},
{"command": "mesh.element.add", "params": {"label": 70, "kind": "quad4", "nodes": [74, 75, 92, 91]}},
{"command": "mesh.element.add", "params": {"label": 71, "kind": "quad4", "nodes": [75, 76, 93, 92]}},
{"command": "mesh.element.add", "params": {"label": 72, "kind": "quad4", "nodes": [76, 77, 94, 93]}},
{"command": "mesh.element.add", "params": {"label": 73, "kind": "quad4", "nodes": [77, 78, 95, 94]}},
{"command": "mesh.element.add", "params": {"label": 74, "kind": "quad4", "nodes": [78, 79, 96, 95]}},
{"command": "mesh.element.add", "params": {"label": 75, "kind": "quad4", "nodes": [79, 80, 97, 96]}},
{"command": "mesh.element.add", "params": {"label": 76, "kind": "quad4", "nodes": [80, 81, 98, 97]}},
{"command": "mesh.element.add", "params": {"label": 77, "kind": "quad4", "nodes": [81, 82, 99, 98]}},
{"command": "mesh.element.add", "params": {"label": 78, "kind": "quad4", "nodes": [82, 83, 100, 99]}},
{"command": "mesh.element.add", "params": {"label": 79, "kind": "quad4", "nodes": [83, 84, 101, 100]}},
{"command": "mesh.element.add", "params": {"label": 80, "kind": "quad4", "nodes": [84, 85, 102, 101]}},
{"command": "mesh.element.add", "params": {"label": 81, "kind": "quad4", "nodes": [86, 87, 104, 103]}},
{"command": "mesh.element.add", "params": {"label": 82, "kind": "quad4", "nodes": [87, 88, 105, 104]}},
{"command": "mesh.element.add", "params": {"label": 83, "kind": "quad4", "nodes": [88, 89, 106, 105]}},
{"command": "mesh.element.add", "params": {"label": 84, "kind": "quad4", "nodes": [89, 90, 107, 106]}},
{"command": "mesh.element.add", "params": {"label": 85, "kind": "quad4", "nodes": [90, 91, 108, 107]}},
{"command": "mesh.element.add", "params": {"label": 86, "kind": "quad4", "nodes": [91, 92, 109, 108]}},
{"command": "mesh.element.add", "params": {"label": 87, "kind": "quad4", "nodes": [92, 93, 110, 109]}},
{"command": "mesh.element.add", "params": {"label": 88, "kind": "quad4", "nodes": [93, 94, 111, 110]}},
{"command": "mesh.element.add", "params": {"label": 89, "kind": "quad4", "nodes": [94, 95, 112, 111]}},
{"command": "mesh.element.add", "params": {"label": 90, "kind": "quad4", "nodes": [95, 96, 113, 112]}},
{"command": "mesh.element.add", "params": {"label": 91, "kind": "quad4", "nodes": [96, 97, 114, 113]}},
{"command": "mesh.element.add", "params": {"label": 92, "kind": "quad4", "nodes": [97, 98, 115, 114]}},
{"command": "mesh.element.add", "params": {"label": 93, "kind": "quad4", "nodes": [98, 99, 116, 115]}},
{"command": "mesh.element.add", "params": {"label": 94, "kind": "quad4", "nodes": [99, 100, 117, 116]}},
{"command": "mesh.element.add", "params": {"label": 95, "kind": "quad4", "nodes": [100, 101, 118, 117]}},
{"command": "mesh.element.add", "params": {"label": 96, "kind": "quad4", "nodes": [101, 102, 119, 118]}},
{"command": "mesh.element.add", "params": {"label": 97, "kind": "quad4", "nodes": [103, 104, 121, 120]}},
{"command": "mesh.element.add", "params": {"label": 98, "kind": "quad4", "nodes": [104, 105, 122, 121]}},
{"command": "mesh.element.add", "params": {"label": 99, "kind": "quad4", "nodes": [105, 106, 123, 122]}},
{"command": "mesh.element.add", "params": {"label": 100, "kind": "quad4", "nodes": [106, 107, 124, 123]}},
{"command": "mesh.element.add", "params": {"label": 101, "kind": "quad4", "nodes": [107, 108, 125, 124]}},
{"command": "mesh.element.add", "params": {"label": 102, "kind": "quad4", "nodes": [108, 109, 126, 125]}},
{"command": "mesh.element.add", "params": {"label": 103, "kind": "quad4", "nodes": [109, 110, 127, 126]}},
{"command": "mesh.element.add", "params": {"label": 104, "kind": "quad4", "nodes": [110, 111, 128, 127]}},
{"command": "mesh.element.add", "params": {"label": 105, "kind": "quad4", "nodes": [111, 112, 129, 128]}},
{"command": "mesh.element.add", "params": {"label": 106, "kind": "quad4", "nodes": [112, 113, 130, 129]}},
{"command": "mesh.element.add", "params": {"label": 107, "kind": "quad4", "nodes": [113, 114, 131, 130]}},
{"command": "mesh.element.add", "params": {"label": 108, "kind": "quad4", "nodes": [114, 115, 132, 131]}},
{"command": "mesh.element.add", "params": {"label": 109, "kind": "quad4", "nodes": [115, 116, 133, 132]}},
{"command": "mesh.element.add", "params": {"label": 110, "kind": "quad4", "nodes": [116, 117, 134, 133]}},
{"command": "mesh.element.add", "params": {"label": 111, "kind": "quad4", "nodes": [117, 118, 135, 134]}},
{"command": "mesh.element.add", "params": {"label": 112, "kind": "quad4", "nodes": [118, 119, 136, 135]}},
{"command": "mesh.element.add", "params": {"label": 113, "kind": "quad4", "nodes": [120, 121, 138, 137]}},
{"command": "mesh.element.add", "params": {"label": 114, "kind": "quad4", "nodes": [121, 122, 139, 138]}},
{"command": "mesh.element.add", "params": {"label": 115, "kind": "quad4", "nodes": [122, 123, 140, 139]}},
{"command": "mesh.element.add", "params": {"label": 116, "kind": "quad4", "nodes": [123, 124, 141, 140]}},
{"command": "mesh.element.add", "params": {"label": 117, "kind": "quad4", "nodes": [124, 125, 142, 141]}},
{"command": "mesh.element.add", "params": {"label": 118, "kind": "quad4", "nodes": [125, 126, 143, 142]}},
{"command": "mesh.element.add", "params": {"label": 119, "kind": "quad4", "nodes": [126, 127, 144, 143]}},
{"command": "mesh.element.add", "params": {"label": 120, "kind": "quad4", "nodes": [127, 128, 145, 144]}},
{"command": "mesh.element.add", "params": {"label": 121, "kind": "quad4", "nodes": [128, 129, 146, 145]}},
{"command": "mesh.element.add", "params": {"label": 122, "kind": "quad4", "nodes": [129, 130, 147, 146]}},
{"command": "mesh.element.add", "params": {"label": 123, "kind": "quad4", "nodes": [130, 131, 148, 147]}},
{"command": "mesh.element.add", "params": {"label": 124, "kind": "quad4", "nodes": [131, 132, 149, 148]}},
{"command": "mesh.element.add", "params": {"label": 125, "kind": "quad4", "nodes": [132, 133, 150, 149]}},
{"command": "mesh.element.add", "params": {"label": 126, "kind": "quad4", "nodes": [133, 134, 151, 150]}},
{"command": "mesh.element.add", "params": {"label": 127, "kind": "quad4", "nodes": [134, 135, 152, 151]}},
{"command": "mesh.element.add", "params": {"label": 128, "kind": "quad4", "nodes": [135, 136, 153, 152]}},
{"command": "mesh.element.add", "params": {"label": 129, "kind": "quad4", "nodes": [137, 138, 155, 154]}},
{"command": "mesh.element.add", "params": {"label": 130, "kind": "quad4", "nodes": [138, 139, 156, 155]}},
{"command": "mesh.element.add", "params": {"label": 131, "kind": "quad4", "nodes": [139, 140, 157, 156]}},
{"command": "mesh.element.add", "params": {"label": 132, "kind": "quad4", "nodes": [140, 141, 158, 157]}},
{"command": "mesh.element.add", "params": {"label": 133, "kind": "quad4", "nodes": [141, 142, 159, 158]}},
{"command": "mesh.element.add", "params": {"label": 134, "kind": "quad4", "nodes": [142, 143, 160, 159]}},
{"command": "mesh.element.add", "params": {"label": 135, "kind": "quad4", "nodes": [143, 144, 161, 160]}},
{"command": "mesh.element.add", "params": {"label": 136, "kind": "quad4", "nodes": [144, 145, 162, 161]}},
{"command": "mesh.element.add", "params": {"label": 137, "kind": "quad4", "nodes": [145, 146, 163, 162]}},
{"command": "mesh.element.add", "params": {"label": 138, "kind": "quad4", "nodes": [146, 147, 164, 163]}},
{"command": "mesh.element.add", "params": {"label": 139, "kind": "quad4", "nodes": [147, 148, 165, 164]}},
{"command": "mesh.element.add", "params": {"label": 140, "kind": "quad4", "nodes": [148, 149, 166, 165]}},
{"command": "mesh.element.add", "params": {"label": 141, "kind": "quad4", "nodes": [149, 150, 167, 166]}},
{"command": "mesh.element.add", "params": {"label": 142, "kind": "quad4", "nodes": [150, 151, 168, 167]}},
{"command": "mesh.element.add", "params": {"label": 143, "kind": "quad4", "nodes": [151, 152, 169, 168]}},
{"command": "mesh.element.add", "params": {"label": 144, "kind": "quad4", "nodes": [152, 153, 170, 169]}},
{"command": "mesh.element.add", "params": {"label": 145, "kind": "quad4", "nodes": [154, 155, 172, 171]}},
{"command": "mesh.element.add", "params": {"label": 146, "kind": "quad4", "nodes": [155, 156, 173, 172]}},
{"command": "mesh.element.add", "params": {"label": 147, "kind": "quad4", "nodes": [156, 157, 174, 173]}},
{"command": "mesh.element.add", "params": {"label": 148, "kind": "quad4", "nodes": [157, 158, 175, 174]}},
{"command": "mesh.element.add", "params": {"label": 149, "kind": "quad4", "nodes": [158, 159, 176, 175]}},
{"command": "mesh.element.add", "params": {"label": 150, "kind": "quad4", "nodes": [159, 160, 177, 176]}},
{"command": "mesh.element.add", "params": {"label": 151, "kind": "quad4", "nodes": [160, 161, 178, 177]}},
{"command": "mesh.element.add", "params": {"label": 152, "kind": "quad4", "nodes": [161, 162, 179, 178]}},
{"command": "mesh.element.add", "params": {"label": 153, "kind": "quad4", "nodes": [162, 163, 180, 179]}},
{"command": "mesh.element.add", "params": {"label": 154, "kind": "quad4", "nodes": [163, 164, 181, 180]}},
{"command": "mesh.element.add", "params": {"label": 155, "kind": "quad4", "nodes": [164, 165, 182, 181]}},
{"command": "mesh.element.add", "params": {"label": 156, "kind": "quad4", "nodes": [165, 166, 183, 182]}},
{"command": "mesh.element.add", "params": {"label": 157, "kind": "quad4", "nodes": [166, 167, 184, 183]}},
{"command": "mesh.element.add", "params": {"label": 158, "kind": "quad4", "nodes": [167, 168, 185, 184]}},
{"command": "mesh.element.add", "params": {"label": 159, "kind": "quad4", "nodes": [168, 169, 186, 185]}},
{"command": "mesh.element.add", "params": {"label": 160, "kind": "quad4", "nodes": [169, 170, 187, 186]}},
{"command": "mesh.element.add", "params": {"label": 161, "kind": "quad4", "nodes": [171, 172, 189, 188]}},
{"command": "mesh.element.add", "params": {"label": 162, "kind": "quad4", "nodes": [172, 173, 190, 189]}},
{"command": "mesh.element.add", "params": {"label": 163, "kind": "quad4", "nodes": [173, 174, 191, 190]}},
{"command": "mesh.element.add", "params": {"label": 164, "kind": "quad4", "nodes": [174, 175, 192, 191]}},
{"command": "mesh.element.add", "params": {"label": 165, "kind": "quad4", "nodes": [175, 176, 193, 192]}},
{"command": "mesh.element.add", "params": {"label": 166, "kind": "quad4", "nodes": [176, 177, 194, 193]}},
{"command": "mesh.element.add", "params": {"label": 167, "kind": "quad4", "nodes": [177, 178, 195, 194]}},
{"command": "mesh.element.add", "params": {"label": 168, "kind": "quad4", "nodes": [178, 179, 196, 195]}},
{"command": "mesh.element.add", "params": {"label": 169, "kind": "quad4", "nodes": [179, 180, 197, 196]}},
{"command": "mesh.element.add", "params": {"label": 170, "kind": "quad4", "nodes": [180, 181, 198, 197]}},
{"command": "mesh.element.add", "params": {"label": 171, "kind": "quad4", "nodes": [181, 182, 199, 198]}},
{"command": "mesh.element.add", "params": {"label": 172, "kind": "quad4", "nodes": [182, 183, 200, 199]}},
{"command": "mesh.element.add", "params": {"label": 173, "kind": "quad4", "nodes": [183, 184, 201, 200]}},
{"command": "mesh.element.add", "params": {"label": 174, "kind": "quad4", "nodes": [184, 185, 202, 201]}},
{"command": "mesh.element.add", "params": {"label": 175, "kind": "quad4", "nodes": [185, 186, 203, 202]}},
{"command": "mesh.element.add", "params": {"label": 176, "kind": "quad4", "nodes": [186, 187, 204, 203]}},
{"command": "mesh.element.add", "params": {"label": 177, "kind": "quad4", "nodes": [188, 189, 206, 205]}},
{"command": "mesh.element.add", "params": {"label": 178, "kind": "quad4", "nodes": [189, 190, 207, 206]}},
{"command": "mesh.element.add", "params": {"label": 179, "kind": "quad4", "nodes": [190, 191, 208, 207]}},
{"command": "mesh.element.add", "params": {"label": 180, "kind": "quad4", "nodes": [191, 192, 209, 208]}},
{"command": "mesh.element.add", "params": {"label": 181, "kind": "quad4", "nodes": [192, 193, 210, 209]}},
{"command": "mesh.element.add", "params": {"label": 182, "kind": "quad4", "nodes": [193, 194, 211, 210]}},
{"command": "mesh.element.add", "params": {"label": 183, "kind": "quad4", "nodes": [194, 195, 212, 211]}},
{"command": "mesh.element.add", "params": {"label": 184, "kind": "quad4", "nodes": [195, 196, 213, 212]}},
{"command": "mesh.element.add", "params": {"label": 185, "kind": "quad4", "nodes": [196, 197, 214, 213]}},
{"command": "mesh.element.add", "params": {"label": 186, "kind": "quad4", "nodes": [197, 198, 215, 214]}},
{"command": "mesh.element.add", "params": {"label": 187, "kind": "quad4", "nodes": [198, 199, 216, 215]}},
{"command": "mesh.element.add", "params": {"label": 188, "kind": "quad4", "nodes": [199, 200, 217, 216]}},
{"command": "mesh.element.add", "params": {"label": 189, "kind": "quad4", "nodes": [200, 201, 218, 217]}},
{"command": "mesh.element.add", "params": {"label": 190, "kind": "quad4", "nodes": [201, 202, 219, 218]}},
{"command": "mesh.element.add", "params": {"label": 191, "kind": "quad4", "nodes": [202, 203, 220, 219]}},
{"command": "mesh.element.add", "params": {"label": 192, "kind": "quad4", "nodes": [203, 204, 221, 220]}},
{"command": "mesh.element.add", "params": {"label": 193, "kind": "quad4", "nodes": [205, 206, 223, 222]}},
{"command": "mesh.element.add", "params": {"label": 194, "kind": "quad4", "nodes": [206, 207, 224, 223]}},
{"command": "mesh.element.add", "params": {"label": 195, "kind": "quad4", "nodes": [207, 208, 225, 224]}},
{"command": "mesh.element.add", "params": {"label": 196, "kind": "quad4", "nodes": [208, 209, 226, 225]}},
{"command": "mesh.element.add", "params": {"label": 197, "kind": "quad4", "nodes": [209, 210, 227, 226]}},
{"command": "mesh.element.add", "params": {"label": 198, "kind": "quad4", "nodes": [210, 211, 228, 227]}},
{"command": "mesh.element.add", "params": {"label": 199, "kind": "quad4", "nodes": [211, 212, 229, 228]}},
{"command": "mesh.element.add", "params": {"label": 200, "kind": "quad4", "nodes": [212, 213, 230, 229]}},
{"command": "mesh.element.add", "params": {"label": 201, "kind": "quad4", "nodes": [213, 214, 231, 230]}},
{"command": "mesh.element.add", "params": {"label": 202, "kind": "quad4", "nodes": [214, 215, 232, 231]}},
{"command": "mesh.element.add", "params": {"label": 203, "kind": "quad4", "nodes": [215, 216, 233, 232]}},
{"command": "mesh.element.add", "params": {"label": 204, "kind": "quad4", "nodes": [216, 217, 234, 233]}},
{"command": "mesh.element.add", "params": {"label": 205, "kind": "quad4", "nodes": [217, 218, 235, 234]}},
{"command": "mesh.element.add", "params": {"label": 206, "kind": "quad4", "nodes": [218, 219, 236, 235]}},
{"command": "mesh.element.add", "params": {"label": 207, "kind": "quad4", "nodes": [219, 220, 237, 236]}},
{"command": "mesh.element.add", "params": {"label": 208, "kind": "quad4", "nodes": [220, 221, 238, 237]}},
{"command": "mesh.element.add", "params": {"label": 209, "kind": "quad4", "nodes": [222, 223, 240, 239]}},
{"command": "mesh.element.add", "params": {"label": 210, "kind": "quad4", "nodes": [223, 224, 241, 240]}},
{"command": "mesh.element.add", "params": {"label": 211, "kind": "quad4", "nodes": [224, 225, 242, 241]}},
{"command": "mesh.element.add", "params": {"label": 212, "kind": "quad4", "nodes": [225, 226, 243, 242]}},
{"command": "mesh.element.add", "params": {"label": 213, "kind": "quad4", "nodes": [226, 227, 244, 243]}},
{"command": "mesh.element.add", "params": {"label": 214, "kind": "quad4", "nodes": [227, 228, 245, 244]}},
{"command": "mesh.element.add", "params": {"label": 215, "kind": "quad4", "nodes": [228, 229, 246, 245]}},
{"command": "mesh.element.add", "params": {"label": 216, "kind": "quad4", "nodes": [229, 230, 247, 246]}},
{"command": "mesh.element.add", "params": {"label": 217, "kind": "quad4", "nodes": [230, 231, 248, 247]}},
{"command": "mesh.element.add", "params": {"label": 218, "kind": "quad4", "nodes": [231, 232, 249, 248]}},
{"command": "mesh.element.add", "params": {"label": 219, "kind": "quad4", "nodes": [232, 233, 250, 249]}},
{"command": "mesh.element.add", "params": {"label": 220, "kind": "quad4", "nodes": [233, 234, 251, 250]}},
{"command": "mesh.element.add", "params": {"label": 221, "kind": "quad4", "nodes": [234, 235, 252, 251]}},
{"command": "mesh.element.add", "params": {"label": 222, "kind": "quad4", "nodes": [235, 236, 253, 252]}},
{"command": "mesh.element.add", "params": {"label": 223, "kind": "quad4", "nodes": [236, 237, 254, 253]}},
{"command": "mesh.element.add", "params": {"label": 224, "kind": "quad4", "nodes": [237, 238, 255, 254]}},
{"command": "mesh.element.add", "params": {"label": 225, "kind": "quad4", "nodes": [239, 240, 257, 256]}},
{"command": "mesh.element.add", "params": {"label": 226, "kind": "quad4", "nodes": [240, 241, 258, 257]}},
{"command": "mesh.element.add", "params": {"label": 227, "kind": "quad4", "nodes": [241, 242, 259, 258]}},
{"command": "mesh.element.add", "params": {"label": 228, "kind": "quad4", "nodes": [242, 243, 260, 259]}},
{"command": "mesh.element.add", "params": {"label": 229, "kind": "quad4", "nodes": [243, 244, 261, 260]}},
{"command": "mesh.element.add", "params": {"label": 230, "kind": "quad4", "nodes": [244, 245, 262, 261]}},
{"command": "mesh.element.add", "params": {"label": 231, "kind": "quad4", "nodes": [245, 246, 263, 262]}},
{"command": "mesh.element.add", "params": {"label": 232, "kind": "quad4", "nodes": [246, 247, 264, 263]}},
{"command": "mesh.element.add", "params": {"label": 233, "kind": "quad4", "nodes": [247, 248, 265, 264]}},
{"command": "mesh.element.add", "params": {"label": 234, "kind": "quad4", "nodes": [248, 249, 266, 265]}},
{"command": "mesh.element.add", "params": {"label": 235, "kind": "quad4", "nodes": [249, 250, 267, 266]}},
{"command": "mesh.element.add", "params": {"label": 236, "kind": "quad4", "nodes": [250, 251, 268, 267]}},
{"command": "mesh.element.add", "params": {"label": 237, "kind": "quad4", "nodes": [251, 252, 269, 268]}},
{"command": "mesh.element.add", "params": {"label": 238, "kind": "quad4", "nodes": [252, 253, 270, 269]}},
{"command": "mesh.element.add", "params": {"label": 239, "kind": "quad4", "nodes": [253, 254, 271, 270]}},
{"command": "mesh.element.add", "params": {"label": 240, "kind": "quad4", "nodes": [254, 255, 272, 271]}},
{"command": "mesh.element.add", "params": {"label": 241, "kind": "quad4", "nodes": [256, 257, 274, 273]}},
{"command": "mesh.element.add", "params": {"label": 242, "kind": "quad4", "nodes": [257, 258, 275, 274]}},
{"command": "mesh.element.add", "params": {"label": 243, "kind": "quad4", "nodes": [258, 259, 276, 275]}},
{"command": "mesh.element.add", "params": {"label": 244, "kind": "quad4", "nodes": [259, 260, 277, 276]}},
{"command": "mesh.element.add", "params": {"label": 245, "kind": "quad4", "nodes": [260, 261, 278, 277]}},
{"command": "mesh.element.add", "params": {"label": 246, "kind": "quad4", "nodes": [261, 262, 279, 278]}},
{"command": "mesh.element.add", "params": {"label": 247, "kind": "quad4", "nodes": [262, 263, 280, 279]}},
{"command": "mesh.element.add", "params": {"label": 248, "kind": "quad4", "nodes": [263, 264, 281, 280]}},
{"command": "mesh.element.add", "params": {"label": 249, "kind": "quad4", "nodes": [264, 265, 282, 281]}},
{"command": "mesh.element.add", "params": {"label": 250, "kind": "quad4", "nodes": [265, 266, 283, 282]}},
{"command": "mesh.element.add", "params": {"label": 251, "kind": "quad4", "nodes": [266, 267, 284, 283]}},
{"command": "mesh.element.add", "params": {"label": 252, "kind": "quad4", "nodes": [267, 268, 285, 284]}},
{"command": "mesh.element.add", "params": {"label": 253, "kind": "quad4", "nodes": [268, 269, 286, 285]}},
{"command": "mesh.element.add", "params": {"label": 254, "kind": "quad4", "nodes": [269, 270, 287, 286]}},
{"command": "mesh.element.add", "params": {"label": 255, "kind": "quad4", "nodes": [270, 271, 288, 287]}},
{"command": "mesh.element.add", "params": {"label": 256, "kind": "quad4", "nodes": [271, 272, 289, 288]}},
{"command": "model.set.create", "params": {"name": "shell", "elements": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256]}},
{"command": "model.set.create", "params": {"name": "diaphragm", "nodes": [17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 272, 289]}},
{"command": "model.set.create", "params": {"name": "midspan", "nodes": [1, 18, 35, 52, 69, 86, 103, 120, 137, 154, 171, 188, 205, 222, 239, 256, 273]}},
{"command": "model.set.create", "params": {"name": "crown", "nodes": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]}},
{"command": "model.material.create", "params": {"name": "Mat", "elastic": {"type": "isotropic", "young": 432000000.0, "poisson": 0.0}}},
{"command": "model.section.create", "params": {"name": "shell", "set": "shell", "material": "Mat", "kind": {"type": "shell", "thickness": 0.25}}},
{"command": "model.boundary_condition.create", "params": {"name": "diaphragm", "type": "displacement", "target": {"set": "diaphragm"}, "values": [null, 0, 0, 0, null, null]}},
{"command": "model.boundary_condition.create", "params": {"name": "midspan", "type": "symmetry", "target": {"set": "midspan"}, "plane": "x"}},
{"command": "model.boundary_condition.create", "params": {"name": "crown", "type": "symmetry", "target": {"set": "crown"}, "plane": "y"}},
{"command": "model.load.create", "params": {"name": "weight", "type": "body_force", "set": "shell", "vector": [0, 0, -360.0]}},
{"command": "model.step.create", "params": {"name": "Load", "procedure": {"type": "static"}, "boundary_conditions": ["diaphragm", "midspan", "crown"], "loads": ["weight"]}},
{"command": "solve.static", "params": {}, "id": "solve"}
]